Java Spring 支持哪些类型的事务传播行为?

Spring框架支持的事务传播行为(Propagation Behavior)是Spring事务管理的一个重要概念。事务传播行为定义了当一个事务方法被另一个事务方法调用时,应该如何处理这两个事务之间的关系。Spring定义了七种不同的事务传播行为,每种行为都有其特定的应用场景和含义。以下是Spring支持的事务传播行为的详细解析:

  1. PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。这种传播行为意味着,如果一个方法在一个事务的上下文中被调用,那么这个方法本身也会成为这个事务的一部分。如果这个方法调用时没有事务,那么Spring会为其创建一个新的事务。
  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。也就是说,如果一个方法在一个事务的上下文中被调用,那么这个方法会加入这个事务。但如果这个方法调用时没有事务,那么它会以非事务的方式执行,不会创建新的事务。
  3. PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。这种传播行为要求方法调用时必须处于事务的上下文中,否则将抛出异常。
  4. PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。这种传播行为意味着,无论方法调用时是否处于事务的上下文中,Spring都会为其创建一个新的事务。如果调用时已经有事务存在,那么这个事务会被挂起,直到新事务完成后才会恢复。
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。这种传播行为会确保方法在非事务的上下文中执行,无论调用时是否处于事务的上下文中。
  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。这种传播行为要求方法调用时不能处于事务的上下文中,否则将抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就执行REQUIRED行为。嵌套事务允许有一个外部事务和一个或多个内部事务。内部事务可以独立于外部事务进行提交或回滚。如果内部事务失败并回滚,那么外部事务可以选择回滚或继续。

以上就是Spring支持的七种事务传播行为的详细解析。在选择使用哪种传播行为时,需要根据具体的业务需求和场景进行考虑。

下面是每种传播行为的应用场景和注意事项:

  1. PROPAGATION_REQUIRED
    应用场景:最常见的选择,适用于大多数情况。当不确定是否已经有事务存在,或者希望确保方法总是在事务的上下文中执行时,可以选择这种传播行为。
    注意事项:由于它可能会加入现有事务,因此需要确保方法的执行不会破坏事务的隔离性或一致性。

  2. PROPAGATION_SUPPORTS
    应用场景:当希望方法支持事务,但在没有事务的情况下也能正常执行时,可以选择这种传播行为。它常用于读操作,因为读操作通常不需要事务来保证数据的一致性。
    注意事项:虽然它在没有事务的情况下也能执行,但如果在事务中调用,需要确保方法的执行不会破坏事务的完整性。

  3. PROPAGATION_MANDATORY
    应用场景:当方法必须在事务的上下文中执行,否则抛出异常时,可以选择这种传播行为。这通常用于那些必须确保在事务中执行的关键业务逻辑。
    注意事项:使用此传播行为时,必须确保方法调用时一定有事务存在,否则将会抛出异常。

  4. PROPAGATION_REQUIRES_NEW
    应用场景:当方法需要独立于其他方法的事务执行时,可以选择这种传播行为。例如,当方法需要执行一些可能会失败并回滚的操作,但不希望这些操作影响其他事务时。
    注意事项:由于它会创建新的事务,因此需要注意事务的开启和关闭,以及可能带来的性能开销。

  5. PROPAGATION_NOT_SUPPORTED
    应用场景:当方法需要在非事务的上下文中执行时,可以选择这种传播行为。这常用于那些不需要事务来保证数据一致性的操作,如查询或日志记录。
    注意事项:由于它会挂起现有事务,因此需要确保方法的执行不会破坏被挂起事务的状态。

  6. PROPAGATION_NEVER
    应用场景:当方法绝对不能在事务的上下文中执行时,可以选择这种传播行为。这通常用于那些与事务无关的操作,或者那些可能会破坏事务完整性的操作。
    注意事项:使用此传播行为时,必须确保方法调用时一定没有事务存在,否则将会抛出异常。

  7. PROPAGATION_NESTED
    应用场景:当需要嵌套事务时,可以选择这种传播行为。嵌套事务允许在一个外部事务中执行多个内部事务,每个内部事务都可以独立地提交或回滚。
    注意事项:嵌套事务可能会增加复杂性,因此需要谨慎使用。同时,不是所有的数据库和事务管理器都支持嵌套事务,因此在使用前需要确认环境是否支持。

总的来说,选择哪种传播行为取决于具体的业务需求和场景。在选择时,需要综合考虑事务的隔离性、一致性、持久性和性能等因素,以确保系统的正确性和高效性。同时,也需要注意事务的开启、提交和回滚等操作,以避免出现数据不一致或其他问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP重传,滑动窗口,流量控制,拥塞控制

TCP重传,滑动窗口,流量控制,拥塞控制 TCP重传机制: 超时重传快速重传SACKD-SACK 通过序列号与确认应答判断是否要重传 超时重传: 超过指定时间没有收到确认应答报文,就会重发该数据 触发超时重传的情况…

SpirngBoot整合快递100

目录 一、注册快递100 二、技术文档地址 三、需要认证的key和comcumer 四、spring boot 整合快递 100使用 4.1 引入快递100和hutool的依赖 4.2 将key和comcumer写入application.properties文件中 4.3 新建一个modle,用于将查出来的json数据转成对象 4.4 新建一个controll…

MySql-日期分组

一、分别统计各时间各类型数据条数 数据库的 request_time字段 数据类型:timestamp 默认值:CURRENT_TIMESTAMP 例子: 2024-01-26 08:25:48 原数据: 1、将数据按照日期(年月日)形式输出 按照request_…

5A手控问道手游戏抢装备说明手册

5A手控-问道抢装备方法 下载软件地址:www.aishouk.com 支持win10 和win 11 系统 下载,安装完成后,打开软件。 下载最好选择 CSDN 或者 百度网盘下载 ,官网下载速度很慢。这点大家 需要注意。 注册/登录 打开软件,点…

Mellanox网卡打流命令ib_write_bw执行遇到Couldn‘t listen to port 18515原因与解决办法?

要点 要点: ib默认使用18515命令 相关命令: netstat -tuln | grep 18515 ib_write_bw --help |grep port# server ib_write_bw --ib-devmlx5_1 --port 88990 # client ib_write_bw --ib-devmlx5_0 1.1.1.1 --port88990现象: 根因&#xf…

首页最新 多IP浏览器防关联:如何配置多个独立且稳定的IP地址?

在互联网时代,IP地址的重要性不言而喻。然而,IP关联问题却成为一项令人担忧的隐私和安全挑战。针对这个问题,多IP浏览器是一种解决方案,可以帮助用户单独配置多个独立且稳定的IP地址,有效地防止IP关联。 一、IP关联是…

ipad的文件如何传到手机里 iPad较大文件怎么发送出去 iMazing下载教程

在现代生活中,随着移动设备的普及和多样化,我们经常需要在不同设备之间传输文件,以便在工作、学习或娱乐中更加便捷地使用这些文件。iPad和iPhone是用户广泛使用的设备,我们时常使用它们来存储和访问大量的个人数据。但有时&#…

春游江淮 请来池州|快乘高铁 趣游池州 池州送福利啦

穿群山,越川泽,通绝隘……池黄高铁呼啸而来! 这条高铁巨龙全长约125公里,设计时速高达350公里。沿途设池州、九华山、黄山西、黟县东4座车站,池州站与宁安高铁相接,黟县东站与杭昌高铁相连,如同纽带般串联起皖南“两山一湖”(九华山、黄山、太平湖)风景名胜区。 池黄高铁开通…

下一代云原生应用引擎OpenNJet体验

文章目录 前言OpenNJet 介绍OpenNJet VS NGINXOpenNJet 安装OpenNJet 动态配置体验动态location动态黑名单动态灰度发布 体验感受 前言 作为一名技术人员,我们应时刻保持对行业动态的关注,今天我们就来体验一下号称下一代云原生应用引擎OpenNJet。 Ope…

亚马逊的Listing是否会导致店铺关联?

亚马逊账号关联是否有可能因为listing产品引起的呢?也会存在关联,但如果其中一个站点出了问题,另一账号跟着出事的情况不多见(因为亚马逊本来就支持卖家到各个站点开店把产品销售的各个区域)。很多客户有过相关的经验都…

Agent AI智能体的未来【模板】

Agent AI智能体的未来 随着Agent AI智能体的智能化水平不断提高,它们在未来社会中的角色、发展路径以及可能带来的挑战也引起了广泛关注。快来分享一下你的看法吧~ 提醒:在发布作品前,请把不需要的内容删掉。 方向一:技术进步与…

一曲《少年中国说》令人情怀激荡

今天,作为四川籍人的本“人民体验官”,将充满自豪感地推广人民日报官方微博文化产品《看我中国少年!川传学子热血合唱少年中国说》。 图片:来源“人民体验官”推广平台 人民微博说:“百年前,梁启超先生一篇…

VTK —— 二、教程六 - 为模型加入3D微件(按下i键隐藏或显示)(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功,若无VTK库则请先参考如下链接编译vtk源码: VTK —— 一、Windows10下编译VTK源码,并用Vs2017代码测试(附编译流程、附编译好的库、vtk测试源码) 教程描述 本…

HFSS19 官方案例教程W03 - SMA接头与微带分支

SMA接头与微带分支 1►射频接头简介 连接器是电子测量中必不可少的重要部件,无论测试仪表还是DUT,无论线缆还是附件,处处都有形形色色的不同连接器的身影。对于射频工程师而言,经常用到的连接器有N型、BNC型、SMA型、3.5 mm、2.92 mm、2.4 mm、1.85 mm、1 mm这几种 (上…

OI Wiki—枚举

//新生训练,搬运整理 简介 枚举(英语:Enumerate)是基于已有知识来猜测答案的问题求解策略。 枚举的思想是不断地猜测,从可能的集合中一一尝试,然后再判断题目的条件是否成立。 要点 给出解空间 建立简洁…

NCC导入导出开发

📣NCC导入导出开发 ✨1. 导入流程图 ✨2. 实现步骤 🐴1. 前端代码实现。 🐴2. 配置文件创建与设置。 🐴3. 后端代码实现。 🐴4. 注册后端代码类。

react-mosaic-component-一个React库--窗格布局

import { Mosaic, MosaicWindow, MosaicZeroState } from "react-mosaic-component";从名为react-mosaic-component的npm包中引入三个组件:Mosaic,MosaicWindow和MosaicZeroState。 react-mosaic-component是一个React库,用于创建…

一文掌握Vue依赖注入:原理、应用场景以及最佳模块化与单元测试实践,提升代码的可维护性与模块化程度

Vue 中的依赖注入(Dependency Injection, DI)机制通过 provide 与 inject API,实现了跨组件层级间的数据与服务透明传递,使父组件能够向其任意深度的子孙组件“注入”依赖,而不需要通过层层传递 props 或使用全局状态管…

接口测试 - postman

文章目录 一、接口1.接口的类型2. 接口测试3. 接口测试流程4. 接口测试用例1. 测试用例单接口测试用例-登录案例 二、HTTP协议1. HTTP请求2. HTTP响应 三、postman1. 界面导航说明导入 导出用例集 Get请求和Post请求的区别:2.postman环境变量和全局变量3. postman 请求前置脚本…

使用ganache实现Web3js和区块链交互的步骤 及问题解决:Command ‘express’ not found等

Web3js和区块链交互 做一个简单的dapp 1.express安装 sudo npm install express -g 出现问题:Command ‘express’ not found, 解决:在安装express时增加generator参数: npm install -g express-generator 成功后使用 express -e MyDa…