首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Java EE进阶 --- SpringBoot】Spring事务传播机制

【Java EE进阶 --- SpringBoot】Spring事务传播机制

作者头像
optimistic_chen
发布2026-01-14 20:46:16
发布2026-01-14 20:46:16
990
举报

事务传播机制

事务传播机制:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的。 上篇博客讲到的事务隔离级别能解决多个事务同时调用一个数据库的问题。

事务传播机制解决的是⼀个事务在多个方法中传递的问题。

在这里插入图片描述
在这里插入图片描述

Spring 7种事务传播机制

@Transactional 注解⽀持事务传播机制的设置,通过 propagation 属性来指定传播行为

  1. Propagation.REQUIRED默认的事务传播机制,如果当前存在事务,则加入该事务;如果当前没有事务,则创建应该新的事务
  2. Propagation.SUPPORTS如果当前存在事务,则加入该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏
  3. Propagation.MANDATORY强制性,如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
  4. Propagation.REQUIRES_NEW创建一个新事务。如果当前存在事务,把当前事务挂起;不管外部方法是否开启事务,Propagation.REQUIRES_NEW修饰的方法都会开启新事务,二者互不干扰。
  5. Propagation.NOT_SUPPORTED以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  6. Propagation.NEVER以非事务方式运行,如果当前存在事务,则抛出异常。
  7. Propagation.NESTED如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 Propagation.REQUIRED。

Propagation.REQUIRED(默认)

代码语言:javascript
复制
@Transactional
public void tansfer(){//开启事务
    updateAcount();//调用
    log();//调用
}
在这里插入图片描述
在这里插入图片描述

Propagation.SUPPORTS

代码语言:javascript
复制
@Transactional(propagation = Propagation.SUPPORTS)
public void getUserInfo(){
     //查询用户信息
}

//被普通方法调用
public void fun(){
    getUserInfo();//非事务方法运行
}

//被事务方法调用
@Transactional
public void funs(){
    getUsetInfo();//加入事务
}
在这里插入图片描述
在这里插入图片描述

Propagation.MANDATORY

代码语言:javascript
复制
@Transactional
public void buy(){
    gift();//必须在事务中
}
@Transactional(propagation = Propagation.MANDATORY)
public void gift(){
    //赠品
}

public void buyGift(){
     gift();//抛出异常
}
在这里插入图片描述
在这里插入图片描述

Propagation.REQUIRES_NEW

代码语言:javascript
复制
@Transactional
public void tansfer(){//开启事务
    updateAcount();//调用
    log();//调用
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(){
    //记录日志
}
在这里插入图片描述
在这里插入图片描述

Propagation.NOT_SUPPORTED

代码语言:javascript
复制
@Transactional
public void decorateHouse() {
    // ... 核心操作
    paintWall(); // 刷墙(在事务内)
    buytools();//买工具
    
}

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void buytools() {
    // ... 买工具,这个操作不在任何事务中
}
在这里插入图片描述
在这里插入图片描述

Propagation.NEVER

代码语言:javascript
复制
@Transactional(propagation = Propagation.NEVER)
public void readOnly() {
    // ... 只读操作
}
在这里插入图片描述
在这里插入图片描述

Propagation.NESTED

代码语言:javascript
复制
@Transactional
public void processOrder() {
    // ... 订单主逻辑
    try {
        processItem1(); // 处理商品1 (NESTED)
    } catch (Exception e) {
        // 只回滚这个商品的操作,其他商品继续处理
    }
    try {
        processItem2(); // 处理商品2 (NESTED)
    } catch (Exception e) {
        // 只回滚这个商品的操作
    }
}

@Transactional(propagation = Propagation.NESTED)
public void processItem1() {
    // ... 处理第一个商品
}
在这里插入图片描述
在这里插入图片描述

总结

事务:

  • 原子性:事务中的操作要么全部完成,要么全部失败
  • 一支性:事务执行前后,数据库处于一致状态
  • 隔离性:并发事务之间相互隔离
  • 持久性:事务提交后,对数据的修改是持久的

Spring事务管理:

  • 编程式事务(手动操作):DataSourceTransactionManager
  • 声明式事务(@Transactional):业务代码不受事务代码污染

关键性配置:

  • READ_UNCOMMITTED:读未提交(最低隔离,有脏读)
  • READ_COMMITTED:读已提交(Oracle默认,解决脏读)
  • REPEATABLE_READ:可重复读(MySQL默认,解决不可重复读)
  • SERIALIZABLE:串行化(最高隔离,解决幻读)
  • Spring 隔离级别还有 :Isolation.DEFAULT

Spring事务传播机制:

Spring事务传播机制就像管理多个团队协作的规则,定义了各个团队(事务方法)如何独立工作、如何协作、出现问题时的责任边界,确保整个项目(业务)能够正确、高效地完成。

完结撒花!🎉

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 事务传播机制
  • Spring 7种事务传播机制
    • Propagation.REQUIRED(默认)
    • Propagation.SUPPORTS
    • Propagation.MANDATORY
    • Propagation.REQUIRES_NEW
    • Propagation.NOT_SUPPORTED
    • Propagation.NEVER
    • Propagation.NESTED
  • 总结
  • 完结撒花!🎉
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档