事务传播(propagation)机制
-
required :支持当前事务,请求事务,没有就新建一个
-
supports: 支持当前事务,有木有都可以,有就支持当前事务
-
mandatory: 支持当前事务,强制要求有事务,否则抛异常
-
requires_new : 不支持当前事务,会将当前事务挂起,新建一个事务,
-
not_supported:不支持当前事务,在无事务状态下运行。
-
never:不支持当前事务,有就抛异常
-
nested: 如果当前事务存在,则执行的代码作为子事务嵌套在当前事务中执行:
外层事务提交,嵌套子事务才提交,外层事务异常回滚,嵌套的子事务也无法提交,会回滚;
嵌套的子事务会在执行时,保存一个savepoint,子事务提交失败,会回滚到savepoint点,如果外层事务调用子事务方法没有捕获异常,那么外层事务也将回滚,捕获异常,则不会回滚。
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
事务的嵌套
这里只描述常见的一种嵌套类型
外层 | 内层 | 事务情况 |
required | required | 如果程序正常执行,那么内层事务不会提交,在外部事务中统一进行事务提交。 如果内层事务,或者外层事务中出现异常情况,那么会在外层事务的处理中统一进行异常回滚。 注意:当内层事务方法抛异常时,即使外层事务捕获了内层事务方法异常,最后提交依然会回滚,因为事务是同一个,而内层方法抛异常时已经标记该事务为回滚状态 |
supports | ||
mandatory | ||
never | 外层方法不能出现事务,如果出现事务则直接报错 | |
not_supported | 外层方法中有事务,直接挂起,内层方法没有异常情况的话直接顺利执行。 如果内层方法有异常的话,那么内层方法中已经执行的数据库操作不会触发回滚, 而外层方法如果没有捕获异常,外层事务也会会进行回滚操作。 如果外层方法中出现了异常, 那么内部方法是不会回滚的,只有外层事务才会回滚 | |
required_new | 如果外层方法中存在事务,内层方法在运行的时候会挂起外层事务并开启一个新的事务,外层事务不影响 内层事务。 如果程序正常执行,则内层方法优先事务提交,然后外层方法再提交。 如果内层方法中存在异常,内层事务会优先回滚,外层方法如果没有捕获异常,外层方法事务也会回滚。 如果外层方法中存在异常,那么内层事务正常正常提交,而外层方法会进行回滚操作 | |
nested | 外层方法中有事务,内层子事务那么直接创建一个保存点,外层事务能够提交,嵌套子事务才能够提交, 外层事务异常回滚,嵌套的子事务也无法提交,会清除savepoint,相当于回滚内层方法之前的操作。 如果内层方法执行没有异常情况,那么会清除保存点信息,并且在外层事务中进行提交操作。 如果内层方法中存在异常情况,会回滚到savepoint,如果外层事务调用子事务方法没有捕获异常,那么外层事务也将回滚,捕获异常,则不会回滚。 |