spring-TransactionTemplate 编程式事务

TransactionTemplate 是 Spring 框架提供的用于管理事务的一种方式。它提供了一种编程式的事务管理方法,允许开发者在代码中显式地控制事务的开始、提交或回滚。与使用 @Transactional 注解相比,TransactionTemplate 提供了更多的灵活性和控制力。

为什么不用 @Transactional

虽然 @Transactional 注解提供了一种简单的方式来声明事务边界,但在某些情况下,它的局限性可能会限制你的应用设计:

  1. 跨越服务边界 :如果你的服务逻辑跨越了多个服务,那么使用 @Transactional 可能会变得复杂,因为每个服务可能有自己的事务边界。
  2. 更细粒度的控制TransactionTemplate 允许你在运行时动态地更改事务属性,比如隔离级别或传播行为。
  3. 异常处理:有时你可能希望根据特定的异常类型来决定是否回滚事务,而不仅仅是所有类型的异常。
  4. 性能考量 :在一些性能敏感的应用中,你可能希望避免代理带来的开销(当使用基于 AOP 的 @Transactional 时),而是选择更轻量级的方法,如 TransactionTemplate

总之,TransactionTemplate@Transactional 都有它们各自的适用场景。选择哪一个取决于你的具体需求以及对事务管理的控制程度。

TransactionTemplate 代码示例
执行事务无返回

复制代码
@Autowired
private TransactionTemplate transactionTemplate;

transactionTemplate.executeWithoutResult(new Consumer<TransactionStatus>() {
            @Override
            public void accept(TransactionStatus transactionStatus) {
                try {
                    // 如果操作成功,不抛出异常,事务将提交
                    memberService.save(member);
                    System.out.println("1/0 = " + 1 / 0);
                    orderItemService.save(orderItem);
                } catch (Exception e) {
                    // 如果操作失败,抛出异常,事务将回滚
                    transactionStatus.setRollbackOnly();
                }
            }
        });

执行事务有返回

复制代码
@Autowired
private TransactionTemplate transactionTemplate;

String rr = transactionTemplate.execute(new TransactionCallback<String>() {
             @Override
             public String doInTransaction(TransactionStatus status) {
                 try {
                     memberService.save(member);
                     System.out.println("1/0 = " + 1 / 0);
                     orderItemService.save(orderItem);
                     return "ok";
                 } catch (Exception e) {
                     //回滚
                     status.setRollbackOnly();
                     return null;
                 }
             }
         });
相关推荐
城管不管39 分钟前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
倔强的石头1061 小时前
向量数据库从相似度检索走向融合数据底座
数据库
今天AI了吗2 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
lilian2333 小时前
Harmony os 技术实战|拼豆制图27:用单字符编码承载 50 张 70×70 图纸
前端·数据库·华为·harmonyos
皮卡丘不断更4 小时前
手机优先的 Personal Ledger:把账目、学习和复盘放到同一个入口
数据库·sqlite·fastapi·开源项目·个人效率
保卫大狮兄5 小时前
设备管理从台账到报废,完整生命周期一次讲清
数据库·设备管理·设备
亚历克斯神5 小时前
智能搜索系统的升级复盘——从 Elasticsearch 到混合检索的检索质量提升
java·spring·微服务
数据安全技术观察5 小时前
数据动态脱敏:让脱敏策略跟着数据目录走
大数据·网络·数据库
小席是个热心肠6 小时前
Redis的自我学习
数据库·redis·学习
2601_965798476 小时前
Salient Theme Setup Guide for Fast Creative WordPress Sites
数据库·web3·php·wordpress