精通Hibernate——多事务并发运行的并发问题

对于同时运行的多个事务,当这些 访问数据库中相同的数据时,如果没有必要的隔离机制,就会导致各种并发问题,这些问题可以归纳为以下几类:
1、第一类丢失更新:撤销一个事务时,把其他事务已提交更新的数据覆盖。
2、脏读:一个事务读到另一个事务未提交的事务
3、虚读:一个事务读到另一个事务已提交的新插入的数据
4、不可重复读:一个事务读到另一个事务已提交的更新数据
5、第二类丢失更新:一个事务覆盖另一个事务已提交的更新数据
下面以取款事务和支票汇入这两个事务情形为例
第一类丢失更新
这种并发问题是由于没有隔离事务造成的。当两个事务更新相同的数据资源时,如果一个事务,另一个事务撤销,那么会连同第一个事务所做的更新也会被撤销。
这里写图片描述
假如支票事务在T6时刻被提交,账户余额变为1100,在T8时刻,取款事务被撤销,数据回退到事务(取款事务)前状态1000元,这样就使用户损失了100元。
脏读
如果第二个事务查询到了第一个事务未提交的更新数据,第二个事务依据这个查询结果继续执行相关操作,但是,接着第一个事务撤销了所做的更新,这会导致第二个事务操纵脏数据。
这里写图片描述
由于支票转账事务查询到了取款事务未提交的更新数据,并且在这个查询结果的基础上进行更新操作,如果取款事务最后被撤销,导致客户损失100元
虚读
虚读是由于一个事务查询到了另一个事务已提交的新插入的数据引起的
这里写图片描述
对于实际应用中,在一个事务中不会对相同的数据查询两次,在T6时刻不再查询数据库,而是直接打印统计结果1000,这个统计结果与数据库中的数据有出入,确切的说,他反应的是T3时刻的数据,而不是当前数据状态。
不可重复读
不可重复读是由于一个事务查询到了另一个事务已经提交的对数据的更新引起的。当第二个事务在某一时刻查询某条记录,在另一时刻再查询相同记录时,看到了第一个事务已提交的对这条数据的更新,第二个事务无法判断到底是哪一个时刻查询到的记录作为计算的基础,因为任务时候查询到的数据都有可能立刻被其他事务更新。
这里写图片描述
第二类丢失更新
第二类丢失更新在实际应用中经常遇到并发问题。当两个或多个事务查询同样的记录,然后各自基于最初的查询结果更新该行时,会造成第二类丢失更新。每个事务都不知道其他事务的存在,最后一个事务对记录所做的更新将覆盖由其他事务对该记录所做的已提交的更新。
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值