TransactionTemplate

1. TransactionTemplate 是什么?

TransactionTemplateSpring 事务管理器 (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?

✅ 适用于:

  1. 事务失败时需要特殊处理(比如日志记录、发送通知)

  2. 动态控制事务提交或回滚(比如业务逻辑决定是否回滚)

  3. 与非 Spring 组件一起使用(比如与第三方库的数据库操作)

如果只是普通的事务管理,用 @Transactional 更简单

@Transactional
public void likeArticle(Long userId, Long articleId) {
    userFootMapper.updatePraiseStatus(userId, articleId, 1);
    notifyMsgMapper.insertNotify(userId, articleId, "用户点赞了你的文章");
}

总结

  • TransactionTemplate 用于手动管理事务,更灵活,适用于 复杂业务逻辑

  • @Transactional 更简洁,适用于 大部分普通的事务场景

  • 如果事务中有多个数据库操作,且需要动态控制事务回滚,可以考虑用 TransactionTemplate

你的项目如果 事务管理较为简单,推荐 使用 @Transactional,如果你希望 在事务失败时执行额外操作TransactionTemplate 会更合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值