Spring_事务

事务的主要内容

  1. 事务定义
    特性:ACID
    并发时产生的问题
    事务的隔离级别

    事务的传播特性
    异常处理
    超时
    只读事务
    TransactionDefinition

  2. 并发时产生的问题
    一个数据库可以允许多个客户端同时访问,即并发的方式访问数据库。数据库中的同一个数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,从而破坏数据的完整性。这些问题可以归为5类,包括3类数据读问题(脏读,不可得复读和幻象读)及两类数据更新问题(第一类丢失更新和第二类丢失更新)。
    脏读
    不可重复读
    幻读
    丢失更新(1,2)

脏读

A事务读取了B事务尚未提交的更改数据,并且在这个数据基础上进行操作。如果此时恰巧B事务进行回滚,那么A事务读到的数据是根本不被承认的。以下是一个取款事务和转账事务并发时引起的脏读场景。
在这里插入图片描述
在这个场景中,B希望取款500元,而后有撤销了动作,而A往同一个账户转账100元,因为A事务读取了B事务尚未提交的数据,因而导致了账户白白丢失了500元。在Oracle数据中,不会发生脏读的情况。

不可重复读

  1. 在一个事务中,两次读取到的同一个记录的数据不一致;
  2. 不可重复读是指A事务读取了B事务已经提交的更改数据。假设A在取款事务的过程中,B往该账户转账100元,A两次读取账户的余额发生不一致;
  3. 在同一个事务中T4和T7时间点读取的账户存款余额不一致;

幻读

在一个事务中,两次读取到的统计数据不一致;
A事务读取B提交的新增数据,这时A事务将出现幻想读的问题。幻读一般发生在计算统计数据的事务中。举个例子,假设银行系统在同一个事务中两次统计存款的总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100元,这时两次统计的总金额将不一致。
在这里插入图片描述
如果新增的数据刚好满足事务的查询条件,那么这个新数据就会进入事务的视野,因而导致两次统计结果不一致的情况。 幻读和不可重复读是两个容易混淆的概念,前者是指读到了其他事物已经提交的新增数据,而后者是读到了已经提交事务的更改数据(更改或删除)。为了避免这两种情况,采取的策略是不同的:防止读到更改数据,只需对操作的数据添加行级锁,阻止操作过程中的数据发送变化,而防止读到新增数据,则往往需要添加一个表级锁–将整张表锁定,防止新增数据(Oracle使用多版本数据的方式实现)

丢失更新1

A事务撤销时,将B事务提交的数据覆盖掉;
A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错可能会造成很严重的问题。通过下面的账号取款转账就可以看出来。
在这里插入图片描述
A事务在撤销时,“不小心”将B事务已经转入账号的金额给抹去了。

丢失更新2

A事务提交时,将B事务提交的数据覆盖掉;
A事务覆盖B事务已经提交的数据,造成B事务所操作丢失。
在这里插入图片描述
在上面的例子,由于支票转账事务覆盖了取款事务对存款余额所做的更新,导致银行最后损失了100元,相反如果转账事务先提交,那么用户损失了100元。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狠情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值