要解决的问题
- 脏读:B事务改了数据,A事务读取到了,B事务回滚(数据没了);
- 不可重复读:B事务改了数据,A事务读取了(B正常提交没有回滚);
- 可重复读:B事务改了数据,管你回不回滚,A事务都读取不到;
- 幻读:A事务和B事务针对某一数据插入都已经过了查询关卡,B事务抢先insert,A事务再插入时(要么插入了同样的一条新数据或者由于MySQL有唯一键触发抛错)。
- 典型场景:超卖库存变负。
如何解决
隔离级别 | 脏读 | 不可重复度 | 幻读 |
---|---|---|---|
RU | √ | √ | √ |
RC | × | √ | √ |
RR | × | × | √ |
S | × | × | × |
- RU:读未提交(READ UNCOMMITTED):事务过程中会读到其他事务未提交的数据更改。
- RC:读提交(READ COMMITTED):事务过程中只会读到其他事务已提交的数据。
- RR:可重复读(REPEATABLE READ):事务过程中不会读取到其他事务的数据变更。
- MySQL中已经通过MVCC和间隙锁减少了幻读的可能性。
- S:串行化(SERIALIZABLE):事务的执行是线性的,相当于自断一臂,不需要并发的优势了。