当前位置: 首页 > article >正文

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;
                 }
             }
         });


http://www.kler.cn/news/306218.html

相关文章:

  • C#笔记10 Thread类怎么终止(Abort)和阻止(Join)线程
  • SQLite的入门级项目学习记录(四)
  • [项目][WebServer][Task]详细讲解
  • python绘制3d建筑
  • flask-sqlalchemy的模型类两个表,既有一对一又有一对多的情况时,解决方法
  • SAP HCM HR_ABS_ATT_TIMES_AT_ENTRY 跨夜班不生效问题
  • 【MyBatis精讲】从入门到精通的详细指南:简化Java持久层操作的艺术
  • 开源 AI 智能名片小程序:开启内容营销新境界
  • Harmony Next 文件命令操作(发送、读取、媒体文件查询)
  • 【最佳实践】配置类封装-Async异步注解以及自定义线程池
  • 对操作系统(OS)管理和进程的理解
  • 28 线性表 · 栈
  • golang的GC(三色标记法+混合写屏障)学习笔记
  • 第一篇---滑动窗口最大值、前 K 个高频元素
  • 初识爬虫2
  • Linux删除SSH生成的密钥对
  • 探索Python的Excel世界:openpyxl的魔法之旅
  • 【homebrew安装】踩坑爬坑教程
  • 路由策略原理与配置
  • C#笔记11 获取线程及其信息,什么是优先级、单元状态、线程状态、执行状态、线程名称以及其他属性?
  • 一文速通calcite结合flink理解SQL从文本变成执行计划详细过程
  • Kubernetes Pod镜像的3种状态
  • STM32-UART配置注释
  • 标准库标头 <bit>(C++20)学习
  • 计算机网络 --- 计算机网络性能【七大性能指标】
  • 如何精确统计Pytorch模型推理时间
  • c语言写的环形队列
  • emWin5的图片半透明之旅
  • 高级java每日一道面试题-2024年9月12日-架构篇[DDD领域驱动篇]-如何使用领域驱动设计(DDD)中的事务脚本模式?
  • Spring4-IoC2-基于注解管理bean