参考

要解决的问题

  • 脏读: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):事务的执行是线性的,相当于自断一臂,不需要并发的优势了。