Spring事务的传播机制

文章介绍了Spring事务传播机制的定义和作用,详细阐述了7种不同的事务传播行为,如REQUIRED、SUPPORTS、MANDATORY等,并通过示例展示了REQUIRED(加入当前事务)和NESTED(嵌套事务)的使用情况及异常处理时的数据回滚差异。
摘要由CSDN通过智能技术生成

事务传播机制是什么?(定义)

Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的。总之,事务传播机制就是多个事务在相互调用时,事务是如何进行传递的。

为什么需要事务传播机制?

事务隔离级别是保证多个并发事务执⾏的可控性的(稳定性的),⽽事务传播机制是保证⼀个事务在多个调⽤⽅法间的可控性的(稳定性的)。

并发事务:多个事务同时调⽤⼀个数据库的问题

事务传播机制:事务传播机制解决的是⼀个事务在多个⽅法中传递的问题 

事务传播机制有哪些?

Spring 事务传播机制包含以下 7 种:

Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。

Propagation.SUPPORTS:如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。

Propagation.MANDATORY:(mandatory为强制性的)如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。

Propagation.REQUIRES_NEW:表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。

Propagation.NOT_SUPPORTED:以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起。

Propagation.NEVER:以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常。

Propagation.NESTED:如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。

根据是否⽀持当前事务分为以下3类:

Spring事务的传播机制使用示例:(演示加入事务REQUIRED和嵌套事务NESTED

加入事务REQUIRED示例:

controller代码如下:

 

UserService代码如下: 

 

LogInfoService代码如下:

 执行结果如下: 

  此时会发现用户表和日志表都已经添加成功了,这是在没有异常的情况下。再次清除数据,我们手动在LogInfoService代码中构造一个算术异常,其他代码不变,再次运行,再来看数据表的变化: 

 

在数据库中可以发现用户表和日志表都没有添加成功。

小结:

加入当前事务:@Transactional(propagation = Propagation.REQUTRED)

方法调用流程: controller/add1 -〉用户添加方法->日志添加方法

当日志添加方法出现异常之后,加入事务的执行结果是:

1、用户添加成功的数据也回滚了

2. 日志添加成功的数据也回滚了

嵌套事务NESTED示例:

此示例与上面代码基本一样,只是传播机制设置不一样:

 

 在无异常情况下,数据均可以添加成功,执行结果如下:

 再次清除数据,我们手动在LogInfoService代码中构造一个算术异常,其他代码不变,再次运行,再来看数据表的变化:

执行结果如下:

 

小结:

嵌套事务:@Transactional(propagation = Propagation.NESTED)

方法调用流程: controller/add1 -〉用户添加方法->日志添加方法

当日志添加方法出现异常之后,嵌套事务的执行结果是:

1、用户数据添加成功了

2. 日志添加成功的数据回滚了

嵌套事务(NESTED)和加⼊事务(REQUIRED )的区别: 

整个事务如果全部执⾏成功,⼆者的结果是⼀样的。如果事务执⾏到⼀半失败了,那么加⼊事务整个事务会全部回滚;⽽嵌套事务会局部回滚,不会影响上⼀个⽅法中执⾏的结果。

总结:

1. 在 Spring 项⽬中使⽤事务,⽤两种⽅法,⼿动操作和声明式⾃动提交,其中后者使⽤的最多,在⽅法上添加 @Transactional 就可以实现了。

2. 设置事务的隔离级别 @Transactional(isolation = Isolation.SERIALIZABLE),Spring 中的事务隔离级别有 5 种。

3. 设置事务的传播机制 @Transactional(propagation = Propagation.REQUIRED),Spring 中的事务传播级别有 7 种。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

crazy_xieyi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值