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

在一个事物方法中开启新事物,完成对数据库的修改

在Java中,使用@Transactional注解来管理事务非常常见。但是,在一个已经标记为@Transactional的方法内部调用另一个也标记了@Transactional的方法时,如果不正确处理,可能会导致一些意料之外的行为。这是因为默认情况下,Spring的@Transactional是基于代理的,这意味着如果在一个事务方法中直接调用另一个事务方法,后者并不会开启新的事务。
 

如何在一个事务方法中开启新事务
如果你想在一个事务方法中开启一个新的独立事务,可以采用以下几种方式:
使用@Transactional(propagation = Propagation.REQUIRES_NEW)
这种方式会强制在当前事务的上下文中开启一个新的事务。如果当前没有事务,那么行为与PROPAGATION_REQUIRED相同。
代码示例:

     @Servicepublic class MyService {@Autowiredprivate AnotherService anotherService;@Transactionalpublic void outerTransaction() {// 外部事务逻辑anotherService.innerTransaction();}@Servicepublic static class AnotherService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void innerTransaction() {// 内部事务逻辑}}}

通过TransactionTemplate或PlatformTransactionManager手动管理事务
这种方式提供了更细粒度的控制,允许你在运行时决定是否需要开启新事务。
代码示例:

     @Servicepublic class MyService {@Autowiredprivate PlatformTransactionManager transactionManager;@Transactionalpublic void outerTransaction() {// 外部事务逻辑TransactionDefinition def = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(def);try {// 内部事务逻辑// 手动提交事务transactionManager.commit(status);} catch (Exception e) {// 如果有异常,回滚事务transactionManager.rollback(status);throw e;}}}

注意事项
使用Propagation.REQUIRES_NEW时,确保理解其对性能和资源的影响,因为它会导致更多的事务上下文切换。
当手动管理事务时,确保正确处理异常和事务的提交或回滚,避免资源泄漏或数据不一致的问题。
这样,你就可以在一个已经处于事务中的方法内,安全地开启并完成对数据库的另一组修改操作。

http://www.lryc.cn/news/407353.html

相关文章:

  • ffmpeg的vignetting filter
  • 商场导航系统:从电子地图到AR导航,提升顾客体验与运营效率的智能解决方案
  • vue3中父子组件的双向绑定defineModel详细使用方法
  • 耳机、音响UWB传输数据模组,飞睿智能低延迟、高速率超宽带uwb模块技术音频应用
  • webpack配置报错:Invalid options object.
  • Java 并发编程:一文了解 Java 内存模型(处理器优化、指令重排序与内存屏障的深层解析)
  • 谷粒商城实战笔记-64-商品服务-API-品牌管理-OSS前后联调测试上传
  • Springboot 开发之 RestTemplate 简介
  • Django transaction.atomic()事务处理
  • 2024.07-电视版免费影视App推荐和猫影视catvod、TVBox源(最新接口地址)
  • 【Python】 基于Q-learning 强化学习的贪吃蛇游戏(源码+论文)【独一无二】
  • 谷粒商城实战笔记-44-前端基础-Vue-整合ElementUI快速开发/设置模板代码
  • Android adb shell ps进程查找以及kill
  • [OJ]水位线问题,1.采用回溯法(深度优先遍历求解)2.采用广度优先遍历求解
  • 《华为数据之道》读书笔记六---面向自助消费的数据服务建设
  • go语言day18 reflect反射
  • 理解 Objective-C 中 `+load` 方法的执行顺序
  • C++:类和对象2
  • Docker安装kkFileView实现在线文件预览
  • ElasticSearch(四)— 数据检索与查询
  • Pytest之parametrize()实现数据驱动
  • 关于鸿蒙系统前景
  • 针对datax-web 中Swagger UI接口未授权访问
  • 生成式AI如何帮助小型企业高效运营?
  • 2024最新网络安全自学路线,内容涵盖3-5年技能提升
  • Postman API测试数据生成秘籍:技巧与实践
  • 【接口自动化_07课_Pytest+Excel+Allure完整框架集成_下】
  • Java开发之反射与动态代理
  • 实习日志1之大模型相关知识概览
  • 华为嵌入式面试题及参考答案(持续更新)