MySQL事务隔离级别
通过 select @@tx_isolation;
可查看事务的隔离级别,由低到高依次为:
- 读未提交
READ-UNCOMMITTED
- 读已提交
READ-COMMITTED
- 可重复读
REPEATABLE-READ
(默认) - 可串行化
SERIALIZABLE
低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
隔离级别产生的问题
可解决多个事务并发存在的脏读(Dirty Read),不可重复读(Nonrepeatable Read),幻读(Phantom Read)等问题。
- 脏读(Dirty Read): A事务已更新一份数据,B事务在此时读取了同一份数据,由于某些原因,A 事务RollBack操作,则B事务所读取的数据就会是不正确的;
- 不可重复读(Nonrepeatable Read): A事务先读取一份数据,B 事务更新数据,A 事务再次读同一份数据。A事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据;
- 幻读(Phantom Read): 在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的;
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | yes | yes | yes |
READ-COMMITTED | no | yes | yes |
REPEATABLE-READ | no | no | yes* |
SERIALIZABLE | no | no | no |
注:REPEATABLE-READ
下,innodb 引擎下的幻读是由 MVCC
或者 GAP 锁
或者是 next-key lock
解决的