zoukankan      html  css  js  c++  java
  • mysql 事务隔离级别

    read-uncommitted(未提交读)
    测试流程:
    1、A设置read-uncommitted, start transaction
    2、B执行start transaction,修改一条记录,
    3、A查询记录,得到了以为正确的记录
    4、B回滚。
    问题:A读到了B没有提交的记录,也就是脏读。


     read-committed(已提交读)

    测试流程:
    1、A设置read-committed, start transaction
    2、B执行start transaction,修改一条记录,查询记录,记录已经修改成功
    3、A查询记录,结果还是老的记录
    4、B提交事务
    5、A再次查询记录,结果是新的记录。
    问题:解决了脏读的问题,但是出现一个新问题,A在一个事务中,两次读取的记录不一致,也就是不可重复读。


    repeatable-read(可重复读)
    测试流程:
    1、A设置repeatable-read, start transaction,查询记录,结果是老的记录
    2、B执行start transaction,修改一条记录,查询记录,记录已经修改成功
    3、A查询记录,结果还是老的记录
    4、B提交事务
    5、A再次查询记录,结果还是老的记录。
    问题:可以重复读,A在事务过程中,即使B修改了数据,并且commit,A读取的还是老的数据。实际上是A读取的数据还是事务开始时的快照。
    注意:这里可能会存在一个新的问题,A在事务过程中,B增加一条记录,并提交,导致A的两次读取不一致,会多一条记录,也就是幻影读。这里只是可能,具体取决于数据库的实现。mysql的repeatable-read实现,不会导致幻影读。


    serializable(可串行化)
    测试流程:
    1、A设置serializable, start transaction,查询记录,结果是老的记录
    2、B执行start transaction,修改一条记录,B卡在这里,要等待A完成才行。
    3、A查询记录,结果还是老的记录,A提交。
    4、B的修改操作才进行下去。
    注意:B在等待过程中,会出现lock超时。这种情况,存在性能问题,因为要一个一个来。

  • 相关阅读:
    checkbox判断选中的三种方法
    bzoj 4031: [HEOI2015]小Z的房间
    bzoj 5056: OI游戏
    Hdoj 5181 numbers
    Loj #6164. 「美团 CodeM 初赛 Round A」数列互质
    Codeforces 869 C The Intriguing Obsession
    Loj #6142. 「2017 山东三轮集训 Day6」A
    bzoj 3714: [PA2014]Kuglarz
    Loj #6185. 烷基计数
    [HNOI2008]水平可见直线
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4540765.html
Copyright © 2011-2022 走看看