Spring 事务的传播行为

文章介绍了Spring框架中事务的传播行为,主要关注REQUIRED和SUPPORTS两种模式。REQUIRED模式下,如果当前无事务则新建,有事务则加入,是Spring的默认设置。如果在方法调用中发生异常,事务会回滚。SUPPORTS模式则是在有事务时参与,无事务时非事务执行。示例展示了不同传播行为对数据库操作的影响。

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

1. 事务的传播

事务的方法之间的调用,事务在这些方法之间传播。

2. 事务的7种传播行为

  • (1) REQUIRED

如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这是最常见的选择,也是Spring默认的事务传播行为。(required需要,没有新建,有加入)

示例1:3条数据均插入失败,数据库数据没有变化。testMain声明了事务,testB执行时加入到当前事务中,testB回滚导致主方法也回滚。

@Component
public class TestMain {

    @Resource
    private StudentService studentService;

    @Resource
    private TestB testB;

    @Transactional(propagation = Propagation.REQUIRED)
    public void testMain() {
        studentService.insertStudent("张三", 18, 90.0);
        testB.testB();
    }
}

@Component
public class TestB {

    @Resource
    private TeacherService teacherService;
    
    @Transactional(propagation = Propagation.REQUIRED)
    public void testB() {
        teacherService.insertTeacher("李老师", 2000);
        int i = 1 / 0;
        teacherService.insertTeacher("宋老师", 3000);
    }
}

示例2:testMain 没有事务,testB有声明事务且传播行为REQUIRED,自己新建事务,学生表入库成功,教师表回滚。

@Component
public class TestMain {

    @Resource
    private StudentService studentService;

    @Resource
    private TestB testB;

    public void testMain() {
        studentService.insertStudent("张三", 18, 90.0);
        testB.testB();
    }
}
@Component
public class TestB {

    @Resource
    private TeacherService teacherService;

    @Transactional(propagation = Propagation.REQUIRED)
    public void testB() {
        teacherService.insertTeacher("李老师", 2000);
        int i = 1 / 0;
        teacherService.insertTeacher("宋老师", 3000);
    }
}
  • (2) SUPPORTS

当前存在事务就加入到当前事务; 不存在就以非事务方法执行。

示例3:testMain 没有事务,testB 默认也没有事务学生张三入库成功,教师李老师入库成功。

如果testMain 加入REQUIRED ,当前存在事务,则加入当前事务中,则三条数据均入库失败。

@Component
public class TestMain {

    @Resource
    private StudentService studentService;

    @Resource
    private TestB testB;

    public void testMain() {
        studentService.insertStudent("张三", 18, 90.0);
        testB.testB();
    }
}
@Component
public class TestB {

    @Resource
    private TeacherService teacherService;

    @Transactional(propagation = Propagation.SUPPORTS)
    public void testB() {
        teacherService.insertTeacher("李老师", 2000);
        int i = 1 / 0;
        teacherService.insertTeacher("宋老师", 3000);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值