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

分段@Transactional 坑及失效问题

@Transactional
背景:在某些情况下,我们需要分段transaction,在最外面没有transaction,里面分成几个transaction,保证分段是成功的。
问题代码:
Service

public Order getOrder1(String id) {Optional<Order> test = orderRepository.findById(id);Order order = getOrder2(id);return order;}@Transactionalpublic Order getOrder2(String id){Order order = orderRepository.lock(id);  // 通过PESSIMISTIC_WRITE锁住这行order  行锁  return order;}

在这种写法下,controller调用service的getOrder1方法, getOrder2锁了order,但是由于aop, 认为getOrder1是没有transaction的,所以getOrder2方法的transaction不会生效。这种情况下getOrder2的lock是无效的。

正确方法
1.
在另外一个Service里面定义getOrder2 通过autowired的方式实现transaction生效。
Service1

public Order getOrder1(String id) {Optional<Order> test = orderRepository.findById(id);Order order = service2.getOrder2(id);return order;}

Service2

@Transactionalpublic Order getOrder2(String id){Order order = orderRepository.lockById(id);  // 通过PESSIMISTIC_WRITE锁住这行order  行锁  return order;}

显示定义一个transaction. 通过transactionTemplate的方式。

public Order getOrder1(String id) {Optional<Order> test = orderRepository.findById(id);Order order = getOrder2(id);return order;}public Order getOrder2(String id){return transactionTemplate.execute(s-> {Order order = orderRepository.lockById(id);  // 通过PESSIMISTIC_WRITE锁住这行order  行锁  return order;});}
http://www.lryc.cn/news/95601.html

相关文章:

  • 25、matlab里面的10中优化方法介绍——Opt_Golden法(matlab程序)
  • 点云拟合球体
  • 基于动态规划(DP)算法的增程式EV能量管理策略研究(MATLAB编程)
  • 前端知识点视频补充
  • python多线程—终止子线程
  • #P1012. [NOIP2015提高组] 神奇的幻方
  • (学习笔记-IP)Ping的工作原理
  • php 进程间通信:管道、uds
  • Stable Diffusion如何生成高质量的图-prompt写法介绍
  • MySQL 高级SQL语句(一)
  • SkyWalking链路追踪-技术文档首页
  • AndroidStudio Memory profiler(内存分析器)
  • 【C++模板进阶】
  • (一)RabbitMQ概念-优势、劣势、应用场景 、AMQP、工作原理
  • JetBrains全家桶:如何自定义实现类TODO注释?
  • 【技术干货】工业级BLE5.2蓝牙模块SKB378 使用教程,AT指令集
  • 零基础深度学习——学习笔记1 (逻辑回归)
  • I want to know on what switchport is connected my computer (10.8.0.2)
  • OpenCv之人脸操作
  • C++[第五章]--指针和引用
  • 用i18next使你的应用国际化-React
  • TSN -促进IT/OT 融合的网络技术
  • 改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例
  • 等保工作如何和企业创新业务发展相结合,实现“安全”和“创新”的火花碰撞?
  • 23.7.25 杭电暑期多校3部分题解
  • 【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)
  • 文档翻译软件那么多,哪个能满足你的多语言需求?
  • MySQL 中NULL和空值的区别
  • 阿里云容器镜像仓库(ACR)的创建和使用
  • 工业的相机与镜头(简单选型)