Spring 事务的传播行为

本文详细解读Spring中的PROPAGATION_MANDATORY传播行为,阐述其在Service层的使用场景,包括无事务情况下抛异常,以及如何确保在已有事务中的强制执行和回滚规则。

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

@Service
public class TestService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private TestService testService;

    @Transactional
    public void methodA() {
        userDao.upAgeById(1);
        try {
            testService.methodB();
        } catch (Exception e) {
            e.printStackTrace();
        }
        int x = 10;
        if (x == 10) {
            throw new RuntimeException("methodA() 出错了");
        }
    }

    @Transactional(propagation = Propagation.MANDATORY)
    public void methodB() {
        userDao.downAgeById(2);
        int x = 9;
        if (x == 10) {
            throw new RuntimeException("methodB() 出错了");
        }
    }

}
 

传播行为

含义

上例说明

不要事务

PROPAGATION_NEVER

A无事务,B非事务执行

A有事务,抛异常

A不能有事务,A和B任何情况都不回滚

PROPAGATION_NOT_SUPPORTED

A无事务,B非事务执行

A有事务,A直接挂起,B非事务执行

A有事务,A有异常自己回滚

可有可无事务

PROPAGATION_SUPPORTS

A有事务,B和A一起用事务

A无事务,B非事务执行

A有事务,A和B其中一个有异常,都回滚

必须有事务

PROPAGATION_REQUIRES_NEW

A不管有无事务,B都新建一个事务

A如果有事务,则A事务直接挂起

A无事务,B有异常自己回滚

A有事务,A或B,谁异常谁回滚

PROPAGATION_NESTED

A无事务,B新建一个事务

A有事务,B在A中嵌套其他事务

A无事务,B有异常自己回滚

A有事务:A异常,B无异常,A和B一起回滚;A无异常,B异常,只有B回滚

PROPAGATION_REQUIRED

A无事务,B新建一个事务

A有事务,B加入A的事务

A无事务,B有异常自己回滚

A有事务,A或B其中一个异常,都回滚

PROPAGATION_MANDATORY

A无事务,抛异常

A有事务,B加入A的事务

A必须有事务,A或B其中一个异常,都回滚

 

注意:挂起时注意死锁状况发生。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值