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

  • 相关阅读:
    关于任意文件下载及上传漏洞
    一文掌握XSS
    WEB层知识点
    课程交流网站项目架构
    docker容器中启动uwsgi秒退
    mongoDB中update_one与find_one_update异同
    Vue集成CKEditor5源代码
    Vue的index.html与其他静态文件分离部署
    scrapy-redis分布式爬虫使用及docker swarm集群部署
    django中form组件的校验时raise ValidationError与self.add_error异同
  • 原文地址:https://www.cnblogs.com/nzbbody/p/4540765.html
Copyright © 2011-2022 走看看