参考资料
- 《高性能 MySQL 第三版》第 1 章 MySQL 架构与历史 Page 8.
- Spring 事务 -- @Transactional的使用 - 简书 (jianshu.com)
READ UNCOMMITTED 未提交读
事务可以读取其他事务未提交的数据,这也被称为 脏读
。比如,事务 A 读取了事务 B 更新后的数据,然后 B 回滚操作,那么 A 读取到的数据是脏数据。
READ COMMITED 提交读
是大多数数据库系统的默认隔离级别。一个事务从开始直到提交之前,所做的任何修改对其他事务都不可见,这个隔离级别有时候也叫 不可重复读
,因为在事务执行两次查询的过程中,可能因为数据被其他事务修改,导致读取到两个不一样的结果。
REPEATABLE READ 可重复读
是 MySQL 的默认事务隔离级别。该级别解决了脏读和不可重复读的问题,但是理论上还是无法解决另外一个幻读的问题。幻读
指的是事务 A 在读取某个范围内的记录时,事务 B 又在该范围插入了一条新的记录,当事务 A 再次读取该范围的记录时,会产生幻行。
在该事务隔离级别下,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是 Next-Key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙事务加了锁,其他事务是不能子啊这个间隙插入记录的,这样可以防止幻读。
SERIALABLE 可串行化
是最高的隔离级别。该隔离级别强制事务串行执行,它会在读取的每一行数据上加锁,这样做可能会导致大量的超时和锁争用的问题。除非在非常需要确保数据一致性而且可以接受没有并发的情况下,才考虑采用该级别。
隔离级别越高,越能保证数据完整性和一致性,但是对并发性能的影响也就越大。
???? 不可重复读和幻读的区别
- 不可重复读侧重于修改,幻读侧重于新增或删除。
- 解决不可重复读的问题只需要锁住满足条件的行,解决幻读需要锁表。