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

Spring中七种Propagation类的事务属性详解


Spring框架提供了七种事务传播行为(Propagation),它们定义了事务方法在调用其他事务方法时的行为规则。这些传播行为是Spring事务管理的核心概念之一。

1. REQUIRED(默认值)
Propagation.REQUIRED

如果当前存在事务,则加入该事务

如果当前没有事务,则创建一个新的事务

这是最常用的传播行为,也是默认值

适用场景:大多数业务方法都适用,确保操作在一个事务中完成。


@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 业务逻辑
}
2. SUPPORTS
Propagation.SUPPORTS

如果当前存在事务,则加入该事务

如果当前没有事务,则以非事务方式执行

适用场景:查询方法,可以适应有事务或无事务的环境。


@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// 查询逻辑
}
3. MANDATORY
Propagation.MANDATORY

如果当前存在事务,则加入该事务

如果当前没有事务,则抛出异常

适用场景:必须在一个已有事务中被调用的方法,否则视为编程错误。


@Transactional(propagation = Propagation.MANDATORY)
public void methodC() {
// 业务逻辑
}
4. REQUIRES_NEW
Propagation.REQUIRES_NEW

创建一个新的事务

如果当前存在事务,则挂起当前事务

适用场景:需要独立事务的操作,如日志记录,不希望受外层事务影响。


@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodD() {
// 业务逻辑
}
5. NOT_SUPPORTED
Propagation.NOT_SUPPORTED

以非事务方式执行

如果当前存在事务,则挂起当前事务

适用场景:不需要事务支持的操作,如某些性能敏感的非关键操作。


@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodE() {
// 业务逻辑
}
6. NEVER
Propagation.NEVER

以非事务方式执行

如果当前存在事务,则抛出异常

适用场景:严格要求不能在事务中执行的方法。


@Transactional(propagation = Propagation.NEVER)
public void methodF() {
// 业务逻辑
}
7. NESTED
Propagation.NESTED

如果当前存在事务,则在嵌套事务内执行

如果当前没有事务,则创建一个新的事务

嵌套事务是外部事务的一部分,只有外部事务提交时,嵌套事务才会提交

嵌套事务可以独立回滚而不影响外部事务

适用场景:需要部分回滚的场景,如批量处理中的单条记录失败不影响其他记录。


@Transactional(propagation = Propagation.NESTED)
public void methodG() {
// 业务逻辑
}
传播行为对比表
传播行为    当前有事务    当前无事务    备注
REQUIRED    加入当前事务    创建新事务    默认值
SUPPORTS    加入当前事务    非事务执行    适合查询
MANDATORY    加入当前事务    抛出异常    强制要求事务
REQUIRES_NEW    挂起当前事务,创建新事务    创建新事务    独立事务
NOT_SUPPORTED    挂起当前事务,非事务执行    非事务执行    不支持事务
NEVER    抛出异常    非事务执行    禁止事务
NESTED    嵌套事务执行    创建新事务    部分回滚能力
实际应用建议
查询方法:使用SUPPORTS或NOT_SUPPORTED,减少不必要的事务开销

核心业务方法:使用REQUIRED,确保数据一致性

日志记录等辅助操作:使用REQUIRES_NEW,避免主业务回滚影响日志记录

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

相关文章:

  • 研发团队看板协作中的自动化实践:集成CI/CD与任务流转
  • 007TG洞察:高效运营Telegram私域流量:技术挑战与自动化解决方案探索
  • 中科米堆CASAIM自动化三维扫描系统自动测量压铸件尺寸
  • 【原创】基于gemini-2.5-flash-preview-05-20多模态模型实现短视频的自动化二创
  • 从 “看懂图” 到 “读懂视频”:多模态技术如何用文本反哺视觉?
  • 原型模式在C++中的实现与面向对象设计原则
  • 二维数点问题 1
  • 学习日志28 python
  • AI编程新时代:从氛围编程到上下文编程的深度实践和思考
  • 鸿蒙开发、大数据开发、Java开发与前端开发全面对比解析
  • 【银行测试】银行票据项目业务+票据测试点分析(四)
  • 2025《艾诺提亚失落之歌》逆向工程解包尝试
  • Linux网络编程:TCP初体验
  • VirtualBox安装教程
  • 64位程序调用32位dll方法
  • 【Linux系统编程】线程概念与控制
  • 使用valgrind工具检测server端lib库的内存泄漏
  • FT5X06 触摸芯片
  • 【技术教程】如何将 ONLYOFFICE 文档连接到 Confluence
  • nodejs 编程基础01-NPM包管理
  • Android 之 Kotlin
  • 让 Spark 干体力活:用 Java 快速找出最小值
  • GaussDB 并行创建索引
  • Webpack 5 Module Federation 模块共享最佳实践
  • AI智能体的安全困境:防护机制与伦理平衡的艺术
  • 高精度惯性导航IMU传感器供应商价格
  • Python-机器学习初识
  • C结构体的几种定义形式 + typedef结合使用的好处
  • 数分思维14:用户研究与数据分析
  • WordPress如何实现隐藏文章部分内容?WordPress无法解析[hide]...[/hide]这类短代码怎么办?