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

    初步:https://www.cnblogs.com/huanongying/p/7021555.html

    比较深入了解锁:https://tech.meituan.com/innodb-lock.html

            http://hedengcheng.com/?p=771#_Toc374698316

    一、事务的基本要素(ACID)

      1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

       2、一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

      拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

     

       3、隔离性(Isolation):隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2   要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

       4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

    二、事务的并发问题

      1、脏读:读回滚:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

      2、不可重复读:读更新读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

        ps:这里有ab事务,a减了,b的减(修改这行)操作会被阻塞,直到a提交了,后面的查询也会受a的影响,此处就不是不可重复读,又或者只能是读,写操作就不行了(后来试验,b可以插入,b删除阻塞(修改这行

        a删  1,b删会阻塞,得不到a实时。2,b插入阻塞,得不到a实时。3,b修改阻塞,得不到a实时(删本行,没有修改到

        a插入 1,b插入不会阻塞,得不到a实时 。2,b删除会阻塞,得不到a实时。3,b修改阻塞,得不到a实时

        a更新,1,b插入阻塞,得不到a实时。2,b修改阻塞,得到a实时,3,b删除阻塞,得不到a实时(删本行,没有影响

        pps:同插入不阻塞,同修改能实时

      3、幻读:没有更新到别人的插入:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

      小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

    三、MySQL事务隔离级别

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted)
    不可重复读(read-committed)
    可重复读(repeatable-read)
    串行化(serializable)

    read-committed试验结果

        a删  1,b删会阻塞。2,b插入阻塞。3,b修改阻塞(删本行,会阻塞

        a插入 1,b插入不会阻塞 。2,b删除会阻塞。3,b修改阻塞

        a更新,1,b插入阻塞。2,b修改阻塞,3,b删除阻塞(删本行,没有影响

     repeatable-read试验结果

     ps:这里有ab事务,a减了,b的减(修改这行)操作会被阻塞,直到a提交了,后面的查询也会受a的影响,此处就不是不可重复读,又或者只能是读,写操作就不行了(后来试验,b可以插入,b删除阻塞(修改这行

        a删  1,b删会阻塞,得不到a实时。2,b插入阻塞,得不到a实时。3,b修改阻塞,得不到a实时(删本行,没有修改到

        a插入 1,b插入不会阻塞,得不到a实时 。2,b删除会阻塞,得不到a实时。3,b修改阻塞,得不到a实时

        a更新,1,b插入阻塞,得不到a实时。2,b修改阻塞,得到a实时,3,b删除阻塞,得不到a实时(删本行,没有影响

        pps:同插入不阻塞,同修改能实时

      

  • 相关阅读:
    spring boot web开发使用kindeditor中调用地图功能的异常情况"此内容不能显示在一个框架中"
    mysql在spring+mybatis中出现value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp的几种种解决办法
    spring oauth2 的认证流程
    mingw32 QT环境在集成一些librtmp代码由于zlib出现的一些错误:undefined reference to `inflate'
    QT下c和c++混编问题
    产品与开发那些事
    Qt5.6 windows下vs2015(vs2012)编译ODBC
    转 2018 疯狂微服务之死
    Source Tree时免登录安装
    Win7系统下局域连接OPC配置
  • 原文地址:https://www.cnblogs.com/vhyc/p/9146505.html
Copyright © 2011-2022 走看看