欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

在 MySQL 中详细实现事务的四个特性

最编程 2024-03-11 17:03:32
...

  • 可重复读​Repeatable Read​允许幻读的实现策略 ​: MVCC​多个版本行控制策略
    MySQL中事务四大特性的实现详解_mysql_02
  • 这种情况下会出现​T1​的更新操作后,导致​T2​两次读取的数据不一致:

    • 通过加行级锁无法解决读取数据不一致的问题:


      • T2​首先读取​x​值
      • T1​经过加锁,解锁的步骤,更新​x​的值,提交事务
      • T2​继续读取,读取出来的值是​T1​更新后的值
      • 这样​T2​两次读取的结果不一致



  • MVCC​多版本行控制:


    • 行级锁是一个悲观锁 ​,MVCC​是一个乐观锁.乐观锁可以在一定程度上避免加锁操作,开销更低
    • InnoDB​的​MVCC​实现是通过保存数据在某个时间点的快照来实现的
    • 一个事务,不管执行多长时间,内部看到的数据是一致的.也就是说,事务在执行过程中不会相互影响


  • MVCC​多版本行控制的具体实现:


    • 通过在每行记录后面保存两个隐藏的列来实现多版本行控制
    • 一个列保存了行的创建时的系统版本号
    • 一个列保存的行的过期时的系统版本号,也就是删除时的系统版本号
    • 每次开始一个新的事务,系统版本号就会递增


      • SELECT操作:


        • 只会查找版本早于或者等于当前事务版本的数据行.这样可以保证事务读取的行,要么是事务开始前就存在的行,要么是事务自身插入或者修改的行
        • 行的删除版本要么是未定义版本号,要么大于当前事务版本号.这样可以保证事务读取的行,在事务开始之前未删除


      • INSERT操作:

        • 将新插入的行保存当前版本号为行版本号

      • DELETE操作:

        • 将删除的行保存当前版本号为删除标识

      • UPDATE操作:

        • UPDATE​操作作为​DELETE​操作和​INSERT​操作的组合


          • DELETE​操作保存当前版本号到原来的行作为删除标识
          • INSERT​操作的行保存当前版本号作为行版本号







  • MVCC多版本行控制策略可以确保一个事务中读取的是同一个数据库版本快照

  • 推荐阅读