MySQL:关于RR的一些实验及拓展

最近收到了很多大佬的讨论,我大概研究了一下。

相关概念

锁相关问题

  • 脏读:一个事务可以读到另一个事务中未提交的数据
  • 不可重复读:在一个事务没有结束时,另外一个事务也访问该同一数据集合,并做了 DML 操作。因此,在第一个事务两次读数据之间,读到的数据可能是不一样的
  • 幻读(丢失更新):一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据的不一致。
  • 虚读:在同一个事务中,连续执行两次查询,但是两次查询之间其他事务插入了新记录,导致后一次查询看到了之前未看到的“虚拟”记录。

事务的隔离级别

  • READ UNCOMMITTED
    • 允许事务查看其他事务所进行的未提交更改
    • 允许“脏”读、 不可重复读和虚读。
  • READ COMMITTED
    • 允许事务查看其他事务所进行的已提交更改
    • 不允许“脏”读。 但允许不可重复读和虚读。
    • 只支持二进制格式为 ROW 情况下
  • REPEATABLE READ
    • 确保每个事务的 SELECT 输出一致
    • InnoDB 的默认级别
    • InnoDB 不允许“脏”读、不可重复读和虚读
  • SERIALIZABLE
    • 将一个事务的结果与其他事务完全隔离, 即一个事务所选的行不能由其他事务更改, 直到该事务完成为止。
    • 分布式事务常用。