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;
                 }
             }
         });
相关推荐
NineData6 小时前
NineData 迁移评估功能正式上线
数据库·dba
NineData12 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师14 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
用户83071968408215 小时前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
全栈老石18 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_2 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤4 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
NE_STOP4 天前
springMVC-HTTP消息转换器与文件上传、下载、异常处理
spring