接口
public interface TransactionalService { void executeWithNewTransactional(Execute execute); <T>T executeWithNewTransactional(ExecuteWithReturn<T> execute); void executeWithTransactional(Execute execute); <T>T executeWithTransactional(ExecuteWithReturn<T> execute); void executeBeforeCommit(Execute execute); void executeAfterCommit(Execute execute); interface Execute{ void doExecute(); } interface ExecuteWithReturn <T>{ T doExecute(); } }实现类
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionSynchronizationAdapter; import org.springframework.transaction.support.TransactionSynchronizationManager; public class TransactionalServiceImpl implements TransactionalService { private Logger logger = LoggerFactory.getLogger(TransactionalServiceImpl.class); /** * 使用新的事务提交 * @param execute */ @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void executeWithNewTransactional(Execute execute) { execute.doExecute(); } @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public <T> T executeWithNewTransactional(ExecuteWithReturn<T> execute) { return execute.doExecute(); } /** * 如果当前有事务则用当前事务,没有则开启新的事务提交 * @param execute */ @Override @Transactional(propagation = Propagation.REQUIRED) public void executeWithTransactional(Execute execute) { execute.doExecute(); } @Override @Transactional(propagation = Propagation.REQUIRED) public <T> T executeWithTransactional(ExecuteWithReturn<T> execute) { return execute.doExecute(); } /** * 在前面的事务完成后执行此例外线程事务 * 比如:用户注册后,给用户发激活邮件(可能邮件服务器比较耗时),这种场景就能用到了 * @param execute */ @Override public void executeAfterCommit(final Execute execute) { if(!TransactionSynchronizationManager.isSynchronizationActive()){ logger.debug("Execute immediately without active Synchronization"); execute.doExecute(); return; } logger.debug("Register to transactionSynchronizationManager"); TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCommit() { logger.debug("Execute after commit"); execute.doExecute(); } }); } /** * 在前面的事务执行之前执行此例外线程事务 * @param execute */ @Override public void executeBeforeCommit(final Execute execute) { if(!TransactionSynchronizationManager.isSynchronizationActive()){ logger.debug("Execute immediately without active Synchronization"); execute.doExecute(); return; } logger.debug("Register to transactionSynchronizationManager"); TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void beforeCommit(boolean readOnly) { logger.debug("Execute before commit"); execute.doExecute(); } }); } }需要配置spring bean (省略)
调用方式
transactionalService.executeWithNewTransactional(new Execute() { @Override public void doExecute() { //todo something 业务代码 } });