zoukankan      html  css  js  c++  java
  • 数据库的脏数据?加锁? 数据库事务隔离级别和锁实现机制

    参考:

    http://comedsh.iteye.com/blog/698733

    并发操作数据库,遇到的问题

    1、丢失更新  
    如果两个事务都要更新数据库一个字段X,x=100

    事务A 事务B
    读取X=100  读取X=100
    写入x=X+100 写入x=X+200
    事务结束x=200  事务结束x=300
      最后x=300

    两个不同事物同时获得相同数据,然后在各自事务中同时修改了该数据,那么先提交的事务更新会被后提交事务的更新给覆盖掉,这种情况事务A的更新就被覆盖掉了、丢失了。

    2、脏读(未提交读) 
    防止一个事务读到另一个事务还没有提交的记录。 如:

    事务A    事务B
      写入x=X+100 (x=200)
    读取X=200 (读取了事务B未提交的数据)    
      事务回滚x=100 
      事务结束x=100
    事务结束  

                  
           

      

    事务读取了未提交的数据,事务B的回滚,导致了事务A的数据不一致,导致了事务A的脏读 !

    3、不可重复读
    一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次的结果应该是一致的;如果不一致,就说明为不可重复读。
    还是用上面的例子

    事务A 事务B
    读取X=100 读取X=100
    读取X=100  写入x=X+100
      事务结束, x=200
    读取X=200
    (此时,在同一个事务A中,读取的X值发生了变化!)
     
    事务结束  


    这种情况事务A多次读取x的结果出现了不一致,即为不可重复读 。

    4 幻读(Phantom Read)

    事务A读的时候读出了15条记录,事务B在事务A执行的过程中 增加 了1条,事务A再读的时候就变成了 16 条,这种情况就叫做幻影读。
    不可重复读说明了做数据库读操作的时候可能会出现的问题。

    解决办法:加事物全局锁

  • 相关阅读:
    TP框架对数据库的操作
    Nginx的安装及配置
    微信小程序的入门
    MySQL的多表联查
    Larave中CSRF攻击
    Linux(三)
    Linux(二)
    Linux(一)
    安全测试检查项
    mysql-视图及索引简介
  • 原文地址:https://www.cnblogs.com/wjw334/p/4490850.html
Copyright © 2011-2022 走看看