我们在实现业务逻辑时,经常会有这种需求:
1、在当前事务A中开启新事务B,事务B中发生异常不可以回滚A,事务B成功执行后返回事务B的返回值;
2、在当前事务A中开启新事务B,事务B中发生异常要求回滚A,事务B成功执行后返回事务B的返回值;
3、在当前事务A中开启新事务B,事务B中发生异常不可以回滚A,事务B成功执行后不需要返回;
4、在当前事务A中开启新事务B,事务B中发生异常要求回滚A,事务B成功执行后不需要返回;
5、注册后置事务B,即当前事务A成功提交后才会执行事务B,事务B异常的话不抛出,只打印异常日志;
6、注册后置事务B,即当前事务A异常时执行事务B,事务B异常的话不抛出,只打印异常日志;
一、配置事务模版
<!--事务模版 1.标志REQUIRES_NEW会新开启事务,外层事务异常外部事务会会馆,不会回滚内部事务的提交 2.标志REQUIRES_NEW的内部事务的异常,内部事务会回滚,外部事务也会回滚--> <bean id="transactionTemplateNew" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager"> <ref bean="transactionManager"/> </property> <property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/> </bean>
二、定义接口
/** * @author zhaojiatao * @date 2019-07-14 */ public interface ICommonTransactionService { /** * 开启一个新事务来执行函数,有返回值;与外部事务互相隔离,发生异常只回滚本事务,不会互相影响 * @param action * @param <T> * @urn */ <T> T newTransactionExecuteAndReturnWithOutThrowable(Supplier<T> action); /** * 开启一个新事务来执行函数,有返回值;内部事务发生异常时会向外抛出异常,内部事务和外部事务均回滚 * @param action * @param <T> * @urn */ <T> T newTransactionExecuteAndReturnThrowable(Supplier<T> action) throws Exception; /** * 开启一个新事务来执行函数,无返回值;与外部事务互相隔离,发生异常只回滚本事务,不会互相影响 * @param f */ void newTransactionRunVoidWithOutThrowable(Runnable f); /** * 开启一个新事务来执行函数,无返回值;内部事务发生异常时会向外抛出异常,内部事务和外部事务均回滚 * @param f */ void newTransactionRunVoidThrowable(Runnable f) throws Exception; /** * 如果当前存在事务,则等当前事务提交后,回头来开启一个新事务执行,如果内部捕捉异常,不往外抛出;如果外部事务提交前外部事物异常,则此函数不会被执行 * https://docs.spring.io/spring/docs/1.2.7/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationAdapter.html * @param f