关于事务2-事务的并发问题

     数据库中多个事务访问同一行数据的时候,可能会导致各种并发问题,破坏数据的完整性。这些问题可以归结为5类,包括3类数据读问题( 脏读、 不可重复读和幻象读)以及2类数据更新问题( 第一类丢失更新和 第二类丢失更新

一、数据读问题

        1.脏读(dirty read):A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。

例:假设原账户1000元,(B开启事务,A开启事务),B查询余额1000元,B取出500元余额更新为500元,而A查询余额500元(脏读),B撤销事务余额恢复1000元,A往相同的账户中转账100元(提交事务)。

结果:余额更新为600元,因为A事务读取了B事务尚未提交的数据,因而造成账户白白丢失了500元!

         2.不可重复读(unrepeatable read):不可重复读是指 A事务读取了B事务已经提交的更改数据

例:假设原账户1000元,(B开启事务,A开启事务),B查询余额为1000元,A查询余额为1000元,A在取款事务的过程中,B往该账户转账100元且余额更新为1100元(提交事务),A再次查询余额为1100元。

结果:A两次读取账户的余额发生不一致(第一次1000元,第二次1100元)!

         3.幻象读(phantom read):A事务读取B事务提交的新增数据,这时A事务将出现幻象读的问题。

例:假设银行系统在同一个事务中,(B开启事务,A开启事务),A统计总存款数10000元,B新增一个账号,并存入100元(B提交事务),A再次统计总存款数为10100元。

结果:两次统计存款账户的总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100元,这时,两次统计的总金额将不一致

        幻象读和不可重复读区别:前者是指读到了其他已经提交事务的新增数据,而后者是指读到了已经提交事务的更改数据(更改或删除),为了避免这两种情况,采取的对策是不同的,防止读取到更改数据,只需要对操作的数据添加行级锁,阻止操作中的数据发生变化,而防止读取到新增数据,则往往需要添加表级锁——将整个表锁定,防止新增数据。

二、2类数据更新问题

        1.第一类丢失更新(回滚丢失,Lost update:A事务撤销时,把已经提交的B事务的更新数据覆盖了。

          标准定义的所有隔离界别都不允许第一类丢失更新发生

例如:假设账户余额1000元,(A开启事务,B开启事务)A查询余额为1000元,B查询余额为1000元且转入100元(B提交事务),A取出100元余额更新为900元(A撤销事务)。

结果:最终余额更新为1000元,A在撤销事务的时候,B转入金额丢失了!

        2.第二类丢失更新(覆盖丢失/两次更新问题,Second lost update:A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失。

          第二类丢失更新,实际上和不可重复读是同一种问题!!

例如:假设账户余额为1000元,(B开启事务,A开启事务),B查询余额为1000元,A查询余额为1000元,B取出100元将余额更新为900元(B提交事务),A汇入100元(A提交事务)。

结果:余额更新为1100元,导致银行损失100元!

 

转载于:https://my.oschina.net/u/4054486/blog/3101346

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值