2.21.1 Propagation.REQUIRES_NEW
在 TestTransServiceImpl 类中的 testPropagationTrans 方法关闭事务
// @Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
}
在 StuServiceImpl 类中的 saveChildren 方法上添加事务
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
清空数据,执行测试方法,发现数据库中有一条记录
在 TestTransServiceImpl 类中的 testPropagationTrans 方法启用事务
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
}
清空数据,执行测试方法,发现数据库没有记录
在 StuServiceImpl 类中的 saveChildren 方法中删除产生异常的语句
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void saveChildren() {
saveChild1();
// int a = 1 / 0;
saveChild2();
}
在 TestTransServiceImpl 类中的 testPropagationTrans 方法中添加产生异常语句
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
int a = 1 / 0;
}
清空数据,执行测试方法,发现数据库中插入两条记录,saveParent 方法回滚,saveChildren 方法执行成功
在 StuServiceImpl 类中的 saveChildren 方法上修改事务属性
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void saveChildren() {
saveChild1();
// int a = 1 / 0;
saveChild2();
}
清空数据,执行测试方法,发现数据库中没有记录
【总结】
Propagation.REQUIRES_NEW:如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用;如果当前没有事务,则同 REQUIRED。
举例:领导有饭吃,我偏不要,我自己买了自己吃。
2.21.2 Propagation.NOT_SUPPORTED
在 TestTransServiceImpl 类中的 testPropagationTrans 方法关闭事务并删除产生异常的语句
// @Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
// int a = 1 / 0;
}
在 StuServiceImpl 类中的 saveChildren 方法上添加事务
@Transactional(propagation = Propagation.NOT_SUPPORTED)
@Override
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
清空数据,执行测试方法,发现数据库中插入两条记录
在 TestTransServiceImpl 类中的 testPropagationTrans 方法启用事务
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
// int a = 1 / 0;
}
清空数据,执行测试方法,发现数据库中插入一条记录,saveParent 方法回滚,saveChildren 方法执行成功
【总结】
Propagation.NOT_SUPPORTED:如果当前有事务,则把事务挂起,自己不适用事务去运行数据库操作。
举例:领导有饭吃,分一点给你,我太忙了,放一边,我不吃。
2.21.3 Propagation.NEVER
在 StuServiceImpl 类中的 saveChildren 方法上修改事务属性
@Transactional(propagation = Propagation.NEVER)
@Override
public void saveChildren() {
saveChild1();
int a = 1 / 0;
saveChild2();
}
清空数据,执行测试方法,提示出错,非法的事务状态,标记的事务传播是 never
在 TestTransServiceImpl 类中的 testPropagationTrans 方法关闭事务
// @Transactional(propagation = Propagation.REQUIRED)
@Override
public void testPropagationTrans() {
stuService.saveParent();
stuService.saveChildren();
// int a = 1 / 0;
}
清空数据,执行测试方法,提示出错
发现数据库中插入两条记录
【总结】
Propagation.NEVER:如果当前有事务存在,则抛出异常。
举例:领导有饭给你吃,我不想吃,我热爱工作,我抛出异常。