zoukankan      html  css  js  c++  java
  • 数据库事务

    1、事务的定义

         事务是由一组SQL语句语句组成的逻辑处理单元。

    2、事务的ACID

    • 原子性(Atomicity)

        一个事务(transaction)的所有操作,要么全部完成,要么全部不完成,不会出现成功一半的情况

    • 一致性(Consistency)

        在事务开始和完成时,数据库中的数据都保持一致的状态,事务开始和结束之间的中间状态不会被其他事务看到

    • 隔离性(Isolation)

       一个事务的执行不能被其他事务干扰

    • 持久性(Durability):

               一个事务一旦提交,改变是永久性的,不会被回滚

    3、事务的实现:

            事务的隔离性由锁机制实现,原子性、一致性和持久性由事务的redo 日志和undo 日志来保证

    4、并发事务带来的问题

    • 第一类更新丢失:A事务撤销时,把已提交的B事务的数据覆盖掉
    • 第二类更新丢失:A事务提交时,把已提交的B事务的数据覆盖掉
    • 脏读:A事务对一数据进行了修改,但尚未提交,B事务读取了A事物修改但未提交的数据。A事务发生异常,回滚了数据,那么此时B事务读取的数据就是脏数据
    • 不可重复读:A事务内,多次读写同一数据,在A事务并没有结束,B事务对这数据进行了修改,那么A事务两次读取的数据可能就不一样的,这样就发生了同一事务内两次相同的查询读到的数据不一样。
    • 幻读:不可重复读的重点是修改,幻读的重点在于新增或者修改,即在一个事物内读取出来的记录数不一样

        避免以上问题的发生,最常用的就是技术,常见的锁如乐观锁、悲观锁

       

    以下图片和解释来自于其它博主,故贴出原博客地址: https://www.cnblogs.com/takumicx/p/9998844.html 

    • 脏写
      脏写是指事务回滚了其他事务对数据项的已提交修改,比如下面这种情况

            在事务1对数据A的回滚,导致事务2对A的已提交修改也被回滚了。


    • 丢失更新

          丢失更新是指事务覆盖了其他事务对数据的已提交修改,导致这些修改好像丢失了一样。
              

            事务1和事务2读取A的值都为10,事务2先将A加上10并提交修改,之后事务2将A减少10并提交修改,A的值最后为,导致事务2对A的修改好像丢失了一样


    • 脏读

            脏读是指一个事务读取了另一个事务未提交的数据

           

            在事务1对A的处理过程中,事务2读取了A的值,但之后事务1回滚,导致事务2读取的A是未提交的脏数据。


    • 不可重复读

       不可重复读是指一个事务对同一数据的读取结果前后不一致。脏读和不可重复读的区别在于:前者读取的是事务未提交的脏数据,后者读取的是事务已经提交的数据,只不过因为数据被其他事务修改过导致前后两次读取的结果不一样,比如下面这种情况
            

            由于事务2对A的已提交修改,事务1前后两次读取的结果不一致。


    • 幻读

       
             

            事务1查询A<5的数据,由于事务2插入了一条A=4的数据,导致事务1两次查询得到的结果不一样

    5、MYSQL事务的隔离级别

    • Read uncommitted (读未提交):

           允许事务读取未被其他事务提交的变更可能出现脏读,不可重复读和幻读问题

    • Read committed (读已提交):

           允许事务读取已经被其他事务提交的变更,可以避免脏读,可能有不可重复读和幻读的问题

    • Repeatable read (可重复读    MYSQL默认隔离级别):

      确保事务可以从一个字段中读取到相同的值,在这个事务持续期间,禁止其他事务对着这字段进行更新,可以避免脏读和不可重复读,可能有幻读

    • Serializable (串行化):

           所有事务一个接一个地串行执行,可以避免脏读、不可重复读、幻读

    参考链接:

    https://www.zhihu.com/question/31346392

    https://www.cnblogs.com/takumicx/p/9998844.html

     

  • 相关阅读:
    NOI-1.1-04输出保留3位小数的浮点数
    百练7619-合影效果-2015正式D题-简单排序&输出格式
    百练6376-二维数组右上左下遍历-2015正式C题
    C++ 开发环境配置
    go语言 http学习
    Git 命令及分支管理学习
    配置go语言编辑环境
    DNS的过程
    Split Array into Consecutive Subsequences
    组委会正在为美团点评CodeM大赛的决赛设计新赛制
  • 原文地址:https://www.cnblogs.com/liujunj/p/9001033.html
Copyright © 2011-2022 走看看