zoukankan      html  css  js  c++  java
  • MySQL InnoDB 事务隔离级别如何实现

    隔离级别 脏读 不可重复读 幻读
    未提交读(Read uncommitted) 可能 可能 可能
    已提交读(Read committed) 不可能 可能 可能
    可重复读(Repeatable read) 不可能 不可能 可能
    可串行化(Serializable) 不可能 不可能 不可能
    • 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
    • 已提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
    • 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
    • 可串行化(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

    InnoDB默认是行级锁,内部会生成三个隐藏字段:db_trx_id(事务id)、db_roll_pt(回滚指针)、delete_flag(删除标记)

    版本链使用场景(readView)

    1. 当前操作的事务id为102,假设版本链数据[1,2,100,101],活跃列表为[100,101],活跃列表就是未提交的活跃事务,因此事务2是已提交,所以事务102会拷贝一份事务2并插入版本链最后一个元素
    2. 当隔离界别为可重复读,需要操作事务查询或修改时,那么就单独读取事务102的数据,这样就能实现隔离其他未提交的事务。
    3. 当隔离界别为读已提交,流程跟可重复读差不多,但在每次读取数据前都会生成一个readView,保证不会查询到当前事务未提交的数据。

    DML操作

    • INSERT:创建一条数据,db_trx_id 的值为当前事务 id, db_roll_pt 为 null 。
    • UPDATE:复制一行数据,将当前复制后这一行的 db_trx_id 置为当前事务的 id,db_roll_pt 是一个指针,指向复制前的那一条的。
    • DELETE:复制一行数据,将当前复制后这一行的 db_trx_id 置为当前事务的 id,db_roll_pt 是一个指针,指向复制前的那一条的。并把 delete_flag 置为 true 。
  • 相关阅读:
    冒泡排序
    对于Random.Next()生成随机数重复的问题
    二分法查找
    工厂方法模式
    简单的工厂模式
    unity AssetBundle打包及加载
    关于谷歌不然安装除商店之外的拓展应用解决
    【Unity与23种设计模式】抽象工厂模式(Abstract Factory)
    【Unity与23种设计模式】解释器模式(Interpreter)
    【Unity与23种设计模式】原型模式(Prototype)
  • 原文地址:https://www.cnblogs.com/nicori/p/13524724.html
Copyright © 2011-2022 走看看