事务在高并发执行的时候可能会发生脏读、不可重复读、幻读, 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read uncommitted) | 是 | 是 | 是 |
不可重复读(read committed) | 否 | 是 | 是 |
可重复读(repeatable read | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
- 未提交读(READUNCOMMITTED)另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)
- 提交读(READCOMMITTED)本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)
- 可重复读(REPEATABLEREAD)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象
- 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。
MySQL中默认是可重复读(repeatable read)
查看当前session事务级别 show variables like '%tx_isolation%';
查看全局事务隔离级别 show global variables like '%tx_isolation%';