并发导致的问题
| 脏读 | 读取其他事务未提交数据 |
|---|---|
| 不可重复读 | 前后多次读取,数据内容不一致(针对update操作) |
| 幻读 | 前后多次读取,数据总量不一致(针对insert和delete操作) |
四种隔离级别:用的最多的是RC和RR
| READ UNCOMMITTED | 一个事务还没提交时,它做的变更就能被别的事务看到。 |
|---|---|
| READ COMMITTED | 一个事务提交之后,它做的变更才会被其他事务看到。 |
| REPEATABLE READ | 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交变更对其他事务也是不可见的。 |
| SERIALIZABLE | “写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。 |
是否可以解决这些问题
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| read uncommitted | 可能 | 可能 | 可能 |
| read committed | 不可能 | 可能 | 可能 |
| repeatable read | 不可能 | 不可能 | 可能 |
| serializable | 不可能 | 不可能 | 可能 |
知识点:
- 有些客户端,自动设置set autocommit=0,导致长事务,建议显示启动事务
- 使用commit work and chain提交,然后自动进入下一事务,不需要再显示启动事务
- 监控超过60秒的长事务:
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;
- SET MAX_EXECUTION_TIME=xxxx; 单位毫秒,用来控制select的最大执行时间(5.7)
5.6 是max_statement_time
- 使用pt-kill 快速杀会话
- 在测试阶段,尽量开启general_log, 及时发现问题
