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);
}
}