Spring事务传播属性

本文讨论了在Java中,当A类依赖B类并进行事务处理时,如何处理嵌套事务的问题,包括使用PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS等不同事务传播行为以及应对策略,如融入现有事务、挂起或创建新的事务等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面试问道这个明明背了好几次但还是说不出来什么。

假设在两个A和B,将B依赖注入A中,则A依赖B,在A方法中调用B方法,且A有事务,B也有事务,通过编程式事务或者@Transactional注解使A,B分别具有事务,在具有事务A方法中调用事务B方法,就产生了事务传播。(B站楠哥)

会产生一种嵌套的事务,类似这样。

怎么解决呢?
(1)当A有事务

        将B的事务删除,用A的事务。(融入A事务)

(2)或者挂起A事务,让B事务独立于A事务运行,

(3)嵌套事务
通过设置保存点,将内部的事务转化为通过保存点回滚只保存点,实现两个事务的操作。

7种:(required / supports / mandatory / requires_new / not supported / never / nested)

PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这是最常见的选择,也是Spring默认的事务传播行为。(required需要,没有新建,有加入)(A有事务,用A的事务,A没有事务,给B创建一个事务,适合DML)。
PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。(supports支持,有则加入,没有就不管了,非事务运行)(如果A有,用A,A没有,就不用事务,适合很多查询操作DQL)。
PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。(mandatory强制性,有则加入,没有异常)
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。(requires_new需要新的,不管有没有,直接创建新事务)
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。(not supported不支持事务,存在就挂起)
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。(never不支持事务,存在就异常)
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。(nested存在就在嵌套的执行,没有就找是否存在外面的事务,有则加入,没有则新建)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值