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

spring 不同service事务如何传递

在Spring中,事务管理是基于代理的,默认情况下事务管理器会在一个service类的方法上创建事务边界。如果两个不同的service方法在同一个事务上下文中被调用,一个service的方法回滚会影响另一个service的方法,具体取决于事务的传播级别。

事务传播(Transaction Propagation)定义了当一个事务方法被另一个事务方法调用时该如何进行事务管理。Spring提供了多种事务传播行为,常见的有以下几种:

  1. PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播行为。
  2. PROPAGATION_REQUIRES_NEW:总是创建一个新的事务,如果当前存在事务,则挂起当前事务。
  3. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,则以非事务方式执行。
  4. PROPAGATION_NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则挂起当前事务。
  5. PROPAGATION_NEVER:总是以非事务方式执行,如果当前存在事务,则抛出异常。
  6. PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,则抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。

例如,如果一个service方法使用PROPAGATION_REQUIRED,另一个service方法也使用PROPAGATION_REQUIRED,并且它们在同一个事务上下文中被调用,那么如果其中一个方法回滚,整个事务都会回滚。相反,如果第二个service方法使用PROPAGATION_REQUIRES_NEW,它将启动一个新的事务,并且它的回滚不会影响第一个事务。

以下是一个示例代码展示了不同事务传播级别的影响:

@Service
public class ServiceA {@Autowiredprivate ServiceB serviceB;@Transactional(propagation = Propagation.REQUIRED)public void methodA() {// 业务逻辑serviceB.methodB();}
}@Service
public class ServiceB {@Transactional(propagation = Propagation.REQUIRES_NEW)public void methodB() {// 业务逻辑}
}

在上面的示例中,如果ServiceBmethodB方法中发生异常并回滚,ServiceAmethodA方法不会受到影响,因为methodB在一个新的事务中执行。但是,如果ServiceBmethodB方法使用Propagation.REQUIREDmethodB的回滚将会影响到methodA

所以,不同service之间的事务是否会相互影响,主要取决于它们使用的事务传播级别。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue3自研开源Tree组件:人性化的拖拽API设计
  • 新手小白要如何自学黑客技术,看这篇就够了!
  • SpringBoot内置Tomcat启动原理
  • 装饰大师——装饰模式(Python实现)
  • UE5 UE4 使用python进行编辑器操作
  • 028-GeoGebra中级篇-脚本的初步的探索
  • python爬虫【3】—— 爬虫反反爬
  • 基于springboot的大学奖学金评定管理系统表结构调试讲解源码
  • 【vueUse库Utilities模块各函数简介及使用方法--第5篇】
  • C# timer.start()和timer1.Enabled=false;的区别
  • .Net Core中Quartz的使用方法
  • 2024年最强网络安全学习路线,详细到直接上清华的教材!
  • 正则采集器之二——后台搭建
  • 前后端分离开发遵循接口规范-YAPI
  • 如何使用 Puppeteer 绕过 Akamai
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【391天】每日项目总结系列128(2018.03.03)
  • Angular 2 DI - IoC DI - 1
  • Map集合、散列表、红黑树介绍
  • SAP云平台里Global Account和Sub Account的关系
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spring boot下thymeleaf全局静态变量配置
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue2.0 实现互斥
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 回流、重绘及其优化
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信支付JSAPI,实测!终极方案
  • 小李飞刀:SQL题目刷起来!
  • 用简单代码看卷积组块发展
  • 最简单的无缝轮播
  • "无招胜有招"nbsp;史上最全的互…
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (~_~)
  • (1)Jupyter Notebook 下载及安装
  • (2022 CVPR) Unbiased Teacher v2
  • (ZT)一个美国文科博士的YardLife
  • (四)React组件、useState、组件样式
  • (原)Matlab的svmtrain和svmclassify
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Linux整合apache和tomcat构建Web服务器
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat批处理(一):@echo off
  • .NET C# 使用 iText 生成PDF
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 给NuGet包添加Readme
  • .NET 解决重复提交问题
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .NET多线程执行函数
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • @ResponseBody
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题