MySQL-脏读

事务在高并发执行的时候可能会发生脏读、不可重复读、幻读, 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大

事务隔离级别 脏读 不可重复读 幻读
读未提交(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%';

相关资料

MySQL 事务隔离实验-认识:脏读、不可重复读、幻读
MySQL InnoDB四个事务级别 与 脏读、不重复读、幻读

发表评论