1. TransactionTemplate 是什么?
TransactionTemplate
是 Spring 事务管理器 (PlatformTransactionManager
) 的一个包装类,允许你 在代码里手动控制事务,并提供 回调机制 来处理事务逻辑。
-
适用于
需要更灵活事务控制
的场景,比如:
-
事务成功和失败有不同的处理逻辑
-
需要手动 提交或回滚事务
-
在 事务中执行多个数据库操作 并进行自定义异常处理
-
2. 使用示例
假设你有一个 用户点赞 的逻辑,涉及 多个数据库操作,你希望确保所有操作 要么全部成功提交,要么全部回滚,你可以用 TransactionTemplate
处理。
示例:手动管理事务
@Service public class ArticleService { @Resource private TransactionTemplate transactionTemplate; @Resource private UserFootMapper userFootMapper; // 用户行为表 @Resource private NotifyMsgMapper notifyMsgMapper; // 消息通知表 public boolean likeArticle(Long userId, Long articleId) { return transactionTemplate.execute(status -> { try { // 1. 更新用户点赞状态 userFootMapper.updatePraiseStatus(userId, articleId, 1); // 2. 插入点赞通知 notifyMsgMapper.insertNotify(userId, articleId, "用户点赞了你的文章"); // 事务提交(如果不抛异常) return true; } catch (Exception e) { // 发生异常时,手动回滚事务 status.setRollbackOnly(); return false; } }); } }
3. TransactionTemplate vs. @Transactional
方式 | 特点 | 适用场景 |
---|---|---|
@Transactional | 声明式事务,Spring 自动管理 | 简单事务,如单个数据库操作 |
TransactionTemplate | 编程式事务,手动管理事务 | 复杂事务,如多操作、回滚控制 |
4. 什么时候用 TransactionTemplate?
✅ 适用于:
-
事务失败时需要特殊处理(比如日志记录、发送通知)
-
动态控制事务提交或回滚(比如业务逻辑决定是否回滚)
-
与非 Spring 组件一起使用(比如与第三方库的数据库操作)
❌ 如果只是普通的事务管理,用 @Transactional
更简单:
@Transactional public void likeArticle(Long userId, Long articleId) { userFootMapper.updatePraiseStatus(userId, articleId, 1); notifyMsgMapper.insertNotify(userId, articleId, "用户点赞了你的文章"); }
总结
-
TransactionTemplate
用于手动管理事务,更灵活,适用于 复杂业务逻辑。 -
@Transactional
更简洁,适用于 大部分普通的事务场景。 -
如果事务中有多个数据库操作,且需要动态控制事务回滚,可以考虑用
TransactionTemplate
。
你的项目如果 事务管理较为简单,推荐 使用 @Transactional
,如果你希望 在事务失败时执行额外操作,TransactionTemplate
会更合适。