Spring事务同步工具类
Spring的事务提供了一套事务同步的机制,暴露一些钩子给用户来执行自己的逻辑。基于此封装了事务钩子工具类。有时候可能我们想当前方法事务提交之后执行一些逻辑,比如发送消息到MQ中,那么可以很优雅的使用该工具类来实现这个目的,而不用将发生消息到MQ这段逻辑放到事物方法外面。
public final class TransactionUtils {
private TransactionUtils() {}
/**
* 事务提交之后执行
* @param action 动作
*/
public static void executeAfterCommit(Runnable action) {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCommit() {
action.run();
}
});
}
}
/**
* 事务回滚之后执行
* @param action 动作
*/
public static void executeAfterRollback(Runnable action) {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCompletion(int status) {
if (TransactionSynchronization.STATUS_ROLLED_BACK == status) {
action.run();
}
}
});
}
}
/**
* 事务完成后执行, 回滚或者提交都有可能
* 根据status来判断
* @param action 动作
*/
public static void executeAfterCompletion(Consumer<Integer> action) {
if (TransactionSynchronizationManager.isSynchronizationActive()) {
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void afterCompletion(int status) {
action.accept(status);
}
});
}
}
}
不使用该工具类写法
@Service
public class BizService {
@Transactional
public void execute() {
// doSomething
}
}
@Service
public class AnotherService {
@Autowired
private BizService bizService;
public void doAction() {
// 事务方法
bizService.execute();
// 发送消息
sendMq();
}
}
使用工具类后
@Service
public class BizService {
@Transactional
public void execute() {
// doSomething
// 事务提交后执行逻辑
TransactionUtils.executeAfterCommit(() -> {
// 发送消息
sendMq();
});
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2016-08-08 poj1094
2016-08-08 poj3026