【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

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

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


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

相关推荐
l***74942 小时前
SQL Server2022版+SSMS安装教程(保姆级)
后端·python·flask
雨中飘荡的记忆3 小时前
Spring事件机制详解
spring
昵称为空C3 小时前
kafka的替代品redpanda部署与SpringBoot集成使用案例
spring boot·后端·kafka
鱼锦0.04 小时前
基于spring+vue把图片文件上传至阿里云oss容器并回显
java·vue.js·spring
q***09804 小时前
Spring Boot 2.7.x 至 2.7.18 及更旧的版本,漏洞说明
java·spring boot·后端
程序员爱钓鱼4 小时前
Python 编程实战 · 进阶与职业发展:数据分析与 AI(Pandas、NumPy、Scikit-learn)
后端·python·trae
程序员爱钓鱼4 小时前
Python 编程实战 · 进阶与职业发展:Web 全栈(Django / FastAPI)
后端·python·trae
q***56384 小时前
Spring Boot 中 RabbitMQ 的使用
spring boot·rabbitmq·java-rabbitmq