使用
@Transactional(propagation = Propagation.REQUIRED)
public static void main() {
System.out.println("123" + aaa);
}
可选级别
若无特殊说明,场景为A方法调用B方法,B方法中会出现异常。A方法不存在事务。
REQUIRED(默认)
使用当前事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的; 如果当前存在事务,那么加入这个事务,成为一个整体。
注解在A方法,全部回滚。注解在B方法,B方法中内容回滚。
领导没饭吃,我有钱,我会自己买了自己吃;领导有饭吃,会分给我一起吃
SUPPORTS
如果当前有事务,则加入当前事务;如果当前没有事务,则不使用事务。
注解在A方法,跟没注解没区别,不回滚;注解在B方法,如果A方法有事务,则加入事务,否则不使用
领导没饭吃,我也没饭吃;领导有饭吃,我也有饭吃。
MANDATORY
当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。
注解在A方法,因为A方法不存在事务,所以会直接报错;注解在B方法,如果A方法有事务,则会加入该事务,如果不存在,报错
领导必须管饭,不管饭就不干了
REQUIRES_NEW
创建一个新事务,如果存在当前事务,则挂起该事务。 可以理解为在执行时,不论当前是否存在事务,总是会新建一个事务。
注意:该场景为A方法调用B方法,A方法中出现异常
注解在A方法,新建事务,全部回滚;注解在B方法,B方法以事务方式执行,A方法回滚
不管领导有没有饭吃,我都不吃,我要自己买给自己吃
NOT_SUPPORTED
始终以非事务方式执行,如果当前存在事务,则挂起当前事务。 可以理解为在执行时,不论当前是否存在事务,都会以非事务的方式运行。
注解在A方法,AB无事务执行;注解在B方法,就算A方法有事务,B方法也仍以非事务方式执行。
领导有饭吃,分一点给你,但是你有脾气,放一边,不吃
NEVER
如果当前有事务存在,则抛出异常。
注解在A方法,按照无事务方式执行,B方法报错AB均不会回滚;注解在B方法,如果A方法有事务,则直接报错
领导有饭吃,分一点给你,但是你有脾气,不仅不吃还要把领导打一顿(抛异常)
NESTED
如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或回滚的。
如果当前没有事务,则同 REQUIRED。
如果主事务提交,会携带子事务一起提交。如果主事务回滚,则子事务一起回滚。但是,如果子事务异常,父事务可以回滚也可以不回滚。
领导犯错,老板怪罪,领导带着小弟一起受罪。而小弟出错,领导可以选择推卸责任。