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

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

事务传播机制

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

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

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(默认)

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

Propagation.SUPPORTS

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

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

//被事务方法调用
@Transactional
public void funs(){
    getUsetInfo();//加入事务
}

Propagation.MANDATORY

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

public void buyGift(){
     gift();//抛出异常
}

Propagation.REQUIRES_NEW

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

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(){
    //记录日志
}

Propagation.NOT_SUPPORTED

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

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

Propagation.NEVER

java 复制代码
@Transactional(propagation = Propagation.NEVER)
public void readOnly() {
    // ... 只读操作
}

Propagation.NESTED

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

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
好好研究15 小时前
Spring Boot - Thymeleaf模板引擎
java·spring boot·后端·thymeleaf
爬山算法15 小时前
Hibernate(76)如何在混合持久化环境中使用Hibernate?
java·后端·hibernate
她说..15 小时前
策略模式+工厂模式实现单接口适配多审核节点
java·spring boot·后端·spring·简单工厂模式·策略模式
csdn_aspnet15 小时前
ASP.NET 8 - Cookie 身份验证
后端·asp.net·cookie·.net8
笔画人生15 小时前
Cursor + 蓝耘API:用自然语言完成全栈项目开发
前端·后端
像少年啦飞驰点、16 小时前
零基础入门 Spring Boot:从“Hello World”到可部署微服务的完整学习路径
java·spring boot·微服务·编程入门·后端开发
undsky_16 小时前
【RuoYi-SpringBoot3-Pro】:将 AI 编程融入传统 java 开发
java·人工智能·spring boot·ai·ai编程
不光头强16 小时前
shiro学习要点
java·学习·spring
无尽的沉默17 小时前
使用Spring Initializr 快速创建Maven管理的springBoot项目
spring boot·spring·maven
有来技术17 小时前
ASP.NET Core 权限管理系统(RBAC)设计与实现|vue3-element-admin .NET 后端
vue.js·后端·c#·asp.net·.net