spring 事物传播级别

本文详细介绍了Spring中七个不同的事务传播级别,包括PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER和PROPAGATION_NESTED。这些级别决定了在嵌套事务中多个事务之间的行为,如是否创建新事务、是否加入现有事务、是否回滚等。文章通过实例解析了每个级别的具体应用场景和事务处理逻辑。
摘要由CSDN通过智能技术生成

Spring事物传播级别:

在处理Spring托管事务时,开发人员能够指定事务在传播方面的行为。换句话说,开发人员能够决定如何将业务方法封装在逻辑事务或物理事务中。不同Spring bean的方法可以在相同的事务范围内执行,也可以跨多个嵌套事务执行。由于每个方法可能都有自己的事物,那么这些方法的事物相互会影响,比如内部事务结果如何影响外部事务,又或外部的事物是如何影响内部事物。Spring 提供了7 中事物传播级别来决定事务的控制范围。
换一句话说,在实际开发中,方法之间各种嵌套调用,这个时候如果嵌套方法各自都有事物,比如A 调用 B,A,B 同时存在事物,这个时候上下文中 存在两个事物,那么这两个事物是如何相互影响; srping 通过事物传播级别 来决定在嵌套事物中,多个事物之间的行为;比如在A 方法已经存在事物了,那么当B 方法执行的时候,B 方法运行在A的事物下,又或者 A 事物挂起,B 方法开启新的事物等等,这些都是有事物传播级别来决定的;

下面将通过 A 方法调用B 方法 例子来说明 不同的事物传播级别:

1、PROPAGATION_REQUIRED

spring 默认的事物传播级别;如果被声明了该事物级别的B 方法在执行的时候发现A 方法中 已经存在事物,那么B 方法将不开启新的事物,加入到A 的事物中,也就是说,接下来A B 方法的事物行为是一致,任意一方抛出异常都将回滚; 如果A不存在事物,B 将新建事物;

OuterService:
@Override
    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
    public void testRequired(){
        User user = new User(null, "demo1", 23, 1);
        //结果:内部异常导致外部事物也回滚
        userMapper.insert(user);
        try {
            //抛出异常
            innerService.testRequired();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

由于 内部方法抛出一个异常,不会立即被当前的try 捕获,异常会被事物中try -catch 捕获会当将当前事物标记为 rollBackOnly;然后才会进入到外部的try-catch; 由于外部方法有捕获异常࿰

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值