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;
                 }
             }
         });
相关推荐
纪莫6 分钟前
技术面:MySQL篇(InnoDB事务执行过程、事务隔离级别、事务并发异常)
数据库·java面试⑧股
M***Z21012 分钟前
springboot中配置logback-spring.xml
spring boot·spring·logback
Nerd Nirvana16 分钟前
数据库模型全景:从原理到实践的系统性指南
数据库·oracle·电力行业
SelectDB19 分钟前
从 Greenplum 到 Doris:集群缩减 2/3、年省数百万,度小满构建超大规模数据分析平台经验
数据库·数据分析·apache
alonewolf_9925 分钟前
MySQL索引优化实战二:分页、关联查询与Count优化深度解析
数据库·mysql
TDengine (老段)1 小时前
TDengine Python 连接器进阶指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据
赵渝强老师1 小时前
【赵渝强老师】OceanBase的配置文件与配置项
数据库·oceanbase
玖日大大2 小时前
OceanBase SeekDB:AI 原生数据库的技术革命与实践指南
数据库·人工智能·oceanbase
高溪流3 小时前
3.数据库表的基本操作
数据库·mysql
alonewolf_993 小时前
深入剖析MySQL锁机制与MVCC原理:高并发场景下的数据库核心优化
数据库·mysql