• 事务隔离(二)


    事务隔离
    1,可重复读隔离级别在事务启动时创建一个视图read-view。
    1)事务执行期间数据一致,不受外界影响。
    2)更新数据时需要先获得行锁,如果其他事务占用了该行的行锁,需要等待直到其他事务提交后释放行锁。

    2,InnoDB在实现多版本并发控制(MVCC)时用到的一致性读视图,即consistent read view用于支持RC(读提交)和RR(可重复读)隔离级别的实现。
    1)InnoDB中每个事务都有一个唯一ID:transaction id,在事务开始时向InnoDB事务系统申请,按照申请顺序严格递增。
    2)每行数据有多个版本,每个版本有row_trx_id,事务更新数据时,生成一个新的数据版本,将事务的transaction id赋值给row_trx_id。
    3)InnoDB为每个事务构造一个数组,保存事务启动时当前正在活跃的所有事务ID(启动了但没提交的所有事务)。
    4)数组里事务ID最小值为低水位,低于该事务ID为已提交事务,当前系统创建事务ID最大值为高水位,高于该事务ID为未开始事务。

    3,视图数组和高水位组成了当前事务的一致性视图(read-view):
    1)当前事务更新可见;
    2)低于低水位事务更新可见;
    3)高于高水位事务更新不可见;
    4)在高低水位之间的事务transaction id在视图数组中更新不可见;
    5)在高低水位之间的事务transaction id不在视图数组中更新可见。

    4,事务查询数据时获取当前记录row_trx_id,所有更新语句会生成undo log,根据以上理论执行undo log回滚到当前事务可见版本,即得到查询数据。
    5,事务更新数据需要先读取当前值后再更新,不能在历史版本上更新,否则当前更新丢失,当前事务更新可见,更新数据后再查询数据可得到更新后的数据。
    6,除了update语句,select语句如果加锁也是当前读,语句后加上lock in share mode读锁,加上for update写锁。

    7,事务的可重复读核心是一致性读,事务更新数据时,只能用当前读,如果当前记录的行锁被其他事务占用,需要进入锁等待。
    1)可重复读的隔离级别下,事务开始时创建一致性视图,之后事务中所有查询都共用这个一致性视图。
    2)读提交的隔离级别下,每个语句执行前重新生成新的视图。

    8,一致性视图的原则为当前事务更新总是可见的,版本未提交的不可见,版本已提交但是在视图创建后提交的不可见,版本已提交,且是在视图创建前提交的可见。
    1)可重复读,查询只承认事务启动前就已经提交的数据;
    2)读提交,查询只承认语句启动前已经提交的数据;
    3)当前读总是读取已经提交完成的最新版本。

    9,表结构不支持可重复读,因表结构没有对应行数据,没有row_trx_id,只能遵循当前读逻辑。

  • 相关阅读:
    Go字符串实战操作大全!
    Github 2024-04-02开源项目日报Top10
    Mybatis缓存及高级映射
    python基础知识(二):变量和常用数据类型
    VS 常用的快捷键指令
    C++ lambda表达式
    【目标检测】图像裁剪/标签可视化/图像拼接处理脚本
    c# 反射专题—————— 介绍一下是什么是反射[ 一]
    英国博士后招聘|林肯大学—植物-土壤相互作用
    Vue 2 TodoList 案例
  • 原文地址:https://blog.csdn.net/mei_true/article/details/127535663