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

Spring 的事务传播机制

Spring 的事务传播机制定义了一个事务方法在遇到已经存在的事务时如何处理。事务传播属性(Propagation)提供了七种机制,以适应不同的业务需求和事务边界管理。

1. Spring 的事务传播机制的类型

(1)REQUIRED(默认传播机制)
  • 描述:如果当前存在事务,则加入该事务;如果没有,则创建一个新事务。
  • 应用场景:适用于大多数情况,因为它遵循“有事务则加入,无事务则创建”的逻辑。
(2)REQUIRES_NEW
  • 描述:无论当前是否存在事务,总是创建一个新事务,并且挂起当前事务(如果有)。
  • 应用场景:适合必须独立于现有事务的场景,比如在一个事务中写操作日志,不受外层事务回滚影响。
(3)SUPPORTS
  • 描述:如果当前存在事务,则加入该事务;如果没有,则以非事务方式执行。
  • 应用场景:适合既可以在事务内执行,也可以在事务外执行的查询操作。
(4)MANDATORY
  • 描述:如果当前存在事务,则加入该事务;如果没有,则抛出异常。
  • 应用场景:适合必须在事务内执行的场景,确保调用方已开启事务。
(5)NOT_SUPPORTED
  • 描述:以非事务方式执行操作,如果当前存在事务,则挂起该事务。
  • 应用场景:适合不需要事务控制,且不希望受到其他事务影响的场景。
(6)NEVER
  • 描述:以非事务方式执行操作,如果当前存在事务,则抛出异常。
  • 应用场景:适合必须在无事务环境中运行的场景。
(7)NESTED
  • 描述:如果当前存在事务,则在嵌套事务中执行;如果没有,则创建一个新事务。
  • 应用场景:适合需要在一个主事务中划分子事务的情况。嵌套事务可以单独回滚而不影响外层事务。

2. 事务传播机制的实现原理

Spring 的事务传播机制基于 AOP(面向切面编程)和事务管理器(如 DataSourceTransactionManager)实现。在调用事务方法时,Spring 会检查当前上下文中是否存在活动事务,并根据传播机制决定如何处理事务。

工作原理:
  1. AOP 拦截方法调用:当调用一个带有 @Transactional 注解的方法时,Spring AOP 会拦截该方法。

  2. 获取事务上下文:Spring 会通过事务管理器检查当前上下文中是否已经存在事务。

  3. 事务管理器检查事务传播属性:根据传播机制的不同,Spring 决定如何处理当前事务:

    • 如果是 REQUIRED,则加入当前事务或创建新事务。
    • 如果是 REQUIRES_NEW,则挂起当前事务,创建一个新事务。
    • 其他机制类似。
  4. 事务同步:Spring 事务管理器会与底层的资源(如数据库连接)同步,确保所有操作在同一事务中执行,保证一致性。

  5. 提交或回滚:根据方法的执行情况,Spring 事务管理器会在方法结束时决定是否提交或回滚事务。如果发生异常,事务管理器根据异常类型和回滚策略进行回滚。

事务传播的边界管理

通过事务管理器,Spring 可以精确控制事务的生命周期,传播机制用于在嵌套调用和复杂业务逻辑中实现更细粒度的事务边界管理,确保事务逻辑与业务需求一致。

3. 常见的应用场景和注意事项

  • 默认使用 REQUIRED:对于绝大多数情况,使用 REQUIRED 是足够的,特别是对于一个整体业务逻辑的开始方法。
  • 日志记录使用 REQUIRES_NEW:日志或审计记录通常使用 REQUIRES_NEW,确保不受外层事务的回滚影响。
  • 避免事务嵌套死锁:对于使用 NESTED 事务的嵌套场景,尽量确保嵌套事务资源不与外层事务资源冲突,避免死锁。

总结来说,Spring 事务传播机制为开发者提供了灵活的事务边界管理,适应各种业务需求。通过传播机制,开发者可以根据业务需求确保操作的原子性和隔离性。

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

相关文章:

  • 线性代数(1)——线性方程组的几何意义
  • 写给自己的一些心得体会
  • 论文阅读(二十九):Multi-scale Interactive Network for Salient Object Detection
  • 常见存储器及其特点
  • 《向量数据库指南》——text-embedding-3-large与Mlivus Cloud打造语义搜索新纪元
  • 通过 Bytebase API 查看数据库审计日志
  • # 渗透测试# 1.安全见闻(6)通讯协议
  • [Gdiplus/Gdi]_[中级]_[实现多行文本的多种颜色绘制-富文本绘制]
  • Ubuntu如何创建一个子用户并赋与管理员权限
  • 【Linux | IO多路复用】epoll的底层原理详解
  • npm run serve 提示异常Cannot read property ‘upgrade‘ of undefined
  • Muggle OCR 是一个高效的本地OCR(光学字符识别)模块
  • 【SpringBoot】万字源码解析——启动流程
  • Nginx 配置初步 下
  • 可视化ETL平台-Kettle的安装及简单使用
  • java8 动态加载jar包至系统的classpath
  • C++二级题 计算好数:1数大于0数(二进制的位运算)
  • 数字孪生城市:智慧城市的未来蓝图
  • Java篇图书管理系统
  • BUUCTF之web篇
  • 010——二叉树(2)线索化
  • 鸿蒙拍照小助手02
  • lua while循环
  • JAVA篇之类和对象
  • IO流详解_CoderLix
  • 241023-RHEL非管理员安装Docker并开放指定宿主机端口部署Gitlab
  • python ubuntu安装加速
  • 100种算法【Python版】第12篇——快速幂算法
  • Java多线程详解②(全程干货!!!)Thread Runnable
  • 机器学习——图神经网络