Spring事务高级支持

xiaoxiao2021-02-28  42

接口

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 业务代码 } });

转载请注明原文地址: https://www.6miu.com/read-2626510.html

最新回复(0)