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超时。这种情况,存在性能问题,因为要一个一个来。

  • 相关阅读:
    关于python的装饰器(初解)
    关于python的创立模块和导入
    2019年春季学期第五周作业
    2019年春季学期第四周作业
    2019年春季学期第三周作业
    pytest
    Python中if __name__ == '__main__':的作用和原理
    oracle中的游标
    oracle中的一些小知识点
    python中str()与repr()函数的区别
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4540765.html
Copyright © 2011-2022 走看看