MySQL:关于RR的一些实验及拓展
最近收到了很多大佬的讨论,我大概研究了一下。
相关概念
锁相关问题
- 脏读:一个事务可以读到另一个事务中未提交的数据
- 不可重复读:在一个事务没有结束时,另外一个事务也访问该同一数据集合,并做了 DML 操作。因此,在第一个事务两次读数据之间,读到的数据可能是不一样的
- 幻读(丢失更新):一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据的不一致。
- 虚读:在同一个事务中,连续执行两次查询,但是两次查询之间其他事务插入了新记录,导致后一次查询看到了之前未看到的“虚拟”记录。
事务的隔离级别
- READ UNCOMMITTED
- 允许事务查看其他事务所进行的未提交更改
- 允许“脏”读、 不可重复读和虚读。
- READ COMMITTED
- 允许事务查看其他事务所进行的已提交更改
- 不允许“脏”读。 但允许不可重复读和虚读。
- 只支持二进制格式为 ROW 情况下
- REPEATABLE READ
- 确保每个事务的 SELECT 输出一致
- InnoDB 的默认级别
- InnoDB 不允许“脏”读、不可重复读和虚读
- SERIALIZABLE
- 将一个事务的结果与其他事务完全隔离, 即一个事务所选的行不能由其他事务更改, 直到该事务完成为止。
- 分布式事务常用。
- 允许事务查看其他事务所进行的未提交更改
- 允许“脏”读、 不可重复读和虚读。
- 允许事务查看其他事务所进行的已提交更改
- 不允许“脏”读。 但允许不可重复读和虚读。
- 只支持二进制格式为 ROW 情况下
- 确保每个事务的 SELECT 输出一致
- InnoDB 的默认级别
- InnoDB 不允许“脏”读、不可重复读和虚读
- 将一个事务的结果与其他事务完全隔离, 即一个事务所选的行不能由其他事务更改, 直到该事务完成为止。
- 分布式事务常用。