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

Spring中事务的传播行为

Spring事务传播行为

        事务传播行为 指的是:在多个事务方法相互调用时,事务应该如何在这些方法间传播。简单来说,就是一个带有事务的方法(比如方法A)调用另一个带有事务的方法(比如方法B)时,方法B是沿用方法A的事务,还是自己新开一个事务,或者以非事务方式运行?这就是由事务传播行为来决定的。Spring框架在 Propagation 枚举中定义了7种传播行为。

7种传播行为详解

        假设我们有两个方法:methodA() 和 methodB()methodA 调用了 methodB。我们来分析不同传播行为下 methodB 的表现。

1. REQUIRED(默认)

  • 语义:支持当前事务。如果当前没有事务,就新建一个事务。

  • 场景:最常用的设置,适用于大多数情况。

  • 举例

    • 如果 methodA 开启了事务,则 methodB 会加入这个事务。

    • 如果 methodA 没有事务,则 methodB 会新建一个事务。

  • 效果:两者处于同一个事务中,任何一个方法抛出异常,整个事务都会回滚。

2. SUPPORTS

  • 语义:支持当前事务。如果当前没有事务,就以非事务方式执行。

  • 场景:该方法可以“适应”调用方,对事务要求不严格,比如查询操作。

  • 举例

    • 如果 methodA 有事务,methodB 则在该事务中运行。

    • 如果 methodA 没有事务,methodB 也以非事务方式执行。

3. MANDATORY

  • 语义:支持当前事务。如果当前没有事务,就抛出异常。

  • 场景:该方法必须在一个已存在的事务中运行,否则认为是编程错误。

  • 举例

    • 如果 methodA 有事务,methodB 正常加入。

    • 如果 methodA 没有事务,methodB 将抛出 IllegalTransactionStateException

4. REQUIRES_NEW

  • 语义:新建事务。如果当前存在事务,则把当前事务挂起。

  • 场景:希望新方法的事务完全独立,不受外层事务失败的影响,比如日志记录(即使业务失败,日志仍需记录)。

  • 举例

    • 无论 methodA 是否有事务,methodB 都会启动一个新事务。

    • methodB 新事务的提交和回滚,与 methodA 的事务完全独立。

    • methodA 的事务会被挂起,等 methodB 的事务执行完毕后再恢复。

5. NOT_SUPPORTED

  • 语义:以非事务方式执行。如果当前存在事务,则把当前事务挂起。

  • 场景:该方法不应在事务中运行,例如执行一些不需要事务的、耗时较长的操作。

  • 举例

    • 无论 methodA 是否有事务,methodB 都会以非事务方式执行。

    • 如果 methodA 有事务,它会被挂起。

6. NEVER

  • 语义:以非事务方式执行。如果当前存在事务,则抛出异常。

  • 场景:严格要求不能在事务中运行的方法,与 MANDATORY 相反。

  • 举例

    • 如果 methodA 没有事务,methodB 正常以非事务方式执行。

    • 如果 methodA 有事务,methodB 将抛出异常。

7. NESTED

  • 语义:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 REQUIRED 类似的操作。

  • 场景:一个复杂事务中可以分支出多个子事务,子事务可以独立回滚而不影响主事务。

  • 举例

    • 如果 methodA 有事务,Spring会启动一个嵌套事务(在数据库中通常通过保存点 Savepoint 实现)。

    • 如果 methodB 失败回滚,只会回滚到它自己的保存点,不会影响 methodA 的后续操作。但 methodA 的失败会导致 methodB 也回滚。

    • 注意:这个行为需要JDBC 3.0以上驱动和支持保存点的数据库(如MySQL的InnoDB引擎)。

http://www.dtcms.com/a/529052.html

相关文章:

  • 将镜像推送到 Docker Hub 或私有仓库
  • 做qq图片的网站吗wordpress没有链接地址
  • 面向模块的综合技术之重定时优化(六)
  • 社交模板网站建设成都青羊网站建设
  • Android 数据持久化(SharedPreferences)
  • 四、高效注意力机制与模型架构
  • 沧州做网站公司兰州网站建站
  • C++ STL:string类(1) |了解string|编码|常用接口|迭代器|算法查找|auto|范围for
  • ESP32 Linux 开发环境
  • 网站建设全国排名alexa排名前三十
  • 声乐基础知识学习
  • Redis底层原理-持久化【详细易懂】
  • 现在建网站可以拖拉式的吗深圳住房建设网站
  • 流量打不开网站怎么办营销型企业网站 网络服务
  • 如何用ps做网站ui如何在云主机上建设网站
  • 营销网站建设818gx做商城网站多少钱
  • 【C/C++】动态加载(dlopen)和直接链接 库的区别
  • 集团内部协同项目管理模式整理表
  • 基于yolov11的机场跑道异物检测系统python源码+pytorch模型+训练数据集+精美GUI界面
  • 【开题答辩全过程】以 滨海游泳馆管理系统为例,包含答辩的问题和答案
  • 阿里云网站实名认证设备租赁业务网站如何做
  • 2025年9月电子学会全国青少年软件编程等级考试(scratch图形化四级)真题及答案
  • 中国万网icp网站备案专题wordpress播放器问题
  • MATLAB图形绘制基础(一)二维图形
  • 软件开发和网站建设泰安网站设计
  • 一文读懂 AUTOSAR 中的 CAN 模块:通俗图解与发送接收全流程
  • 弹窗网站制作器中国空间站
  • 网站建设会议纪要wordpress创建页面地址设置
  • 软装设计素材网站地方宣传网站建设的必要性
  • Auto CAD二次开发——创建圆弧对象