Spring关于事务的应用

本文介绍了数据库事务的概念,包括事务的开始、提交和回滚过程。在Spring框架中,如何定义事务管理器并使用@Transactional注解处理转账操作,确保数据一致性。还讨论了事务的传播性,以及如何手动设置回滚策略。
摘要由CSDN通过智能技术生成

1.事务的定义

事务是指数据库管理系统中的一个操作序列,这些操作要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和可靠性,即在多个操作同时进行时,要么全部成功,要么全部失败,不会出现部分操作成功,部分操作失败的情况。事务通常包括开始、提交和回滚三个步骤,开始表示事务的开始,提交表示事务的成功执行,回滚表示事务的失败执行。

2.定义事务管理器

在Spring的配置类中,定义一个事务管理器

事务是对数据库的操作,所以事务的对象要得到所要操作数据库的数据源,通过注解的方式,把数据源作为参数传递给事务管理器,最后,在事务管理器方法的上方加上@Bean 注解,把返回的对象加入容器中管理

3.转账案例

通过一个银行转账的案例来理解事务的作用,假设,银行中有两个账户,分别是A和B,现在要实现A账户向B账户转钱,如果一切正常的情况下,应该是A账户的钱减少,B账户的钱增加。但是如果在转账的时候,系统出现错误,则转账失败,这时候A账户和B账户的钱都应该不变

1.定义转账方法

在数据层的Dao接口中,定义两个转账方法,分别表示进钱和出钱

2.调用转账方法

在业务层接口定义一个方法,用来调用数据层的两个转账方法

该方法的三个参数分别是A账户的名字,B账户的名字,和两个账户之间的转账金额

在该接口的实现类中调用数据层接口的两个转账方法

先自动注入数据层接口的对象,然后通过该对象调用数据层接口的方法

由上述两个图片可知,业务层接口中的 transfer() 方法里面调用了两个转账方法,所以这两个转账方法要么都执行成功,则转账成功;要么都执行失败,则转账失败;不能出现一个成功一个失败的情况,即一个账户出钱成功,另一个账户进钱失败。所以两个转账方法必须保持一致性

所以在业务层接口中的 transfer() 方法上方加上@Transactional 注解,该注解的作用是要求 transfer() 方法内执行的所有方法都必须保持一致性,即要么全部成功,要么全部失败。

同时,在Spring的配置类中,要开启事务注解

这样,对于添加了@Transactional 注解的方法,如果该方法在执行中出现了异常,则该方法中调用的所有方法都失败

4.事务的回滚

1.回滚的定义

事务的回滚是指在数据库管理系统中,当一个事务执行过程中发生错误或者异常,导致事务无法继续执行或者执行结果不符合预期时,系统会将事务中已经执行的操作全部撤销,恢复到事务开始之前的状态,以保证数据的一致性和完整性。这样可以避免因为错误操作导致数据损坏或者不一致的情况发生。回滚操作通常由数据库管理系统自动执行,也可以通过编程语言或者数据库管理工具手动触发。

2.手动添加回滚

在@Transactional 注解的后面加上“rollbackFor" ,表示遇到的异常类型,然后在后面加上需要处理的各种异常类型,这样,只要在方法的执行过程中,遇到所手动添加的异常时,程序就会回滚

5.事务的传播性

上述讲了只要在方法的上方加上@Transactional 注解,则该方法里面调用的所有方法都保持一致性,要么全成功,要么全失败。如果现在想要其中一个方法不与其他的方法保持一致,就是相当于把其中某一个方法隔离出来,当其他方法都执行失败时,被隔离出来的方法依然能执行成功

在想要隔离的方法上方的@Transactional 注解后面加上这一句话,这表示该方法要单独开一个事务,不与其他的方法共用一个事务,这样,就算该方法和其他方法一起加入到某个事务中,其他方法的失败也不会影响该方法的执行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

托马斯家的

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

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

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

打赏作者

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

抵扣说明:

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

余额充值