【Springboot入门- 事务】

news/2024/9/29 4:10:07/

基础理解

  • 基本概念
    • 事务:是一组原子性的数据库操作,要么全部成功,要么全部失败。
    • ACID:事务需要满足原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
  • 事务管理的两种方式
    • 编程式事务管理:通过编码的方式管理事务,使用 TransactionTemplate 或 PlatformTransactionManager。
    • 声明式事务管理:通过注解或 XML 配置来管理事务,更常见且易于使用。
  • 使用 @Transactional 注解
    在 Spring Boot 中,声明式事务管理通常是通过 @Transactional 注解来实现的。这个注解可以添加到类或方法上。
    • 添加到类上:类中的所有方法都会拥有相同的事务属性。
    • 添加到方法上:只有被注解的方法会使用指定的事务属性。
  • 配置事务属性
    @Transactional 注解支持多种属性,如:
    • propagation:事务的传播行为。
    • isolation:事务的隔离级别。
    • timeout:事务的超时时间。
    • readOnly:指定事务是否为只读。
    • rollbackFor:指定哪些异常会导致事务回滚。
    • noRollbackFor:指定哪些异常不会导致事务回滚。
  • 事务传播行为
    • REQUIRED:默认行为,如果存在事务,就加入事务;否则,创建一个新的事务。
    • REQUIRES_NEW:创建一个新的事务,如果存在事务,将当前事务挂起。
    • PROPAGATION_NOT_SUPPORTED:非事务的执行,如果存在事务,将抛出异常。
  • 隔离级别
    • READ_UNCOMMITTED
    • READ_COMMITTED
    • REPEATABLE_READ (mysql 默认)
    • SERIALIZABLE
  • 处理事务异常
    • 事务在遇到运行时异常时默认会回滚,但你可以自定义回滚规则。

事务失效的场景

  • 方法的可见性问题
    • 事务方法没有经过Spring代理对象,导致事务失效。
java">	@Servicepublic class MyService {@Transactionalpublic void myTransactionalMethod() {// 事务逻辑}public void myNonTransactionalMethod() {myTransactionalMethod(); // 直接调用,不走代理对象}
}
  • 自调用
    • 在同一个类中,一个方法内部调用了另一个带有 @Transactional 注解的方法,事务不会启动。
java">@Service
public class MyService {@Transactionalpublic void myTransactionalMethodA() {myTransactionalMethodB(); // 自调用,事务不会启动}@Transactionalpublic void myTransactionalMethodB() {// 事务逻辑}
}
  • 非代理对象调用
    • 通过非代理对象调用事务方法,事务不会生效。
java">@Service
public class MyService {@Transactionalpublic void myTransactionalMethod() {// 事务逻辑}
}// 某个地方的代码
MyService myService = new MyService();
myService.myTransactionalMethod(); // 直接创建对象调用,不走代理
  • 异常未被正确抛出
    • 事务方法内部抛出的异常没有被正确捕获和处理,导致事务没有回滚。
java">@Service
public class MyService {@Transactionalpublic void myTransactionalMethod() {// 事务逻辑if (true) {throw new RuntimeException("Error occurred");}}
}
  • 事务传播属性
    • 事务的传播行为设置不正确,导致事务失效。
java">@Service
public class MyService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void myTransactionalMethodA() {myTransactionalMethodB();}public void myTransactionalMethodB() {// 非事务方法}
}
  • 数据库不支持事务
  • 多个事务管理器
    • 在有多个事务管理器的情况下,没有指定正确的事务管理器。
java">@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Beanpublic PlatformTransactionManager txManager1() {return new DataSourceTransactionManager(dataSource1);}@Beanpublic PlatformTransactionManager txManager2() {return new DataSourceTransactionManager(dataSource2);}
}@Service
public class MyService {@Transactional(value = "txManager1", propagation = Propagation.REQUIRES_NEW)public void myTransactionalMethodA() {// 事务方法使用txManager1}
}
  • 异步方法
    • 在 @Transactional 方法中启动了新的线程执行任务,新线程中的任务不会继承原方法的事务上下文。
java">@Service
public class MyService {@Transactionalpublic void myTransactionalMethod() {new Thread(() -> {// 非事务代码}).start();}
}
  • 超时设置
    • 事务运行时间超过了设置的超时时间,导致事务被数据库自动回滚。
java">@Service
public class MyService {@Transactional(timeout = 1) // 超时时间设置为1秒public void myTransactionalMethod() {// 事务逻辑,如果执行时间超过1秒,事务可能会回滚}
}

http://www.ppmy.cn/news/1531764.html

相关文章

Day101 代码随想录打卡|动态规划篇--- 分割等和子集

题目(leecode T416): 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 方法:本题是一道01背包的应用题,需要将题目转化为01背包的形式。…

WordPress 要求插件开发人员进行双因素身份验证

全球超过40%的网站由 WordPress 提供支持,其庞大的插件和主题生态系统在全球范围内提供了灵活性和定制性。然而,这种受欢迎程度也使其成为网络攻击的主要目标。 WordPress 将为所有插件和主题开发人员引入强制性双因素身份验证 (2FA),以应对…

每日一练算法题(使用栈完成回文判断)

回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符串是否为回文。 函数接口定义: int IsPalindrome(char s[]); //判断字符串s是否回文。 其中 s 是用户传入的参数&#…

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现,我原来用的多个工作簿存入的方法,发现不太可行,如果我用原来的方法,然后for循环,新的dataframe会把原来的覆盖掉,然后只剩下一个工作薄。原先的代码: with pd.ExcelWriter(file_name ) …

备考中考的制胜法宝 —— 全国历年中考真题试卷大全

在中考这场重要的战役中,每一分都至关重要。为了帮助广大考生更好地备考,我们精心整理了这份全国历年中考真题试卷大全,旨在为大家提供最全面、最权威的备考资料。 文章目录 1. 全科覆盖,无遗漏2. 历年真题,权威可靠3.…

feign的全局拦截器和局部拦截器

拦截器和过滤器在java中用的最多的应该是处理一些head头,进行鉴权,签名等处理。feign也不例外。 一、feign全局拦截器 全局拦截器对每个feign客户端都生效 配置这里省略。 全局拦截器定义 package com.vvvtimes.interceptor;import feign.RequestIn…

Android常用C++特性之std::optional

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。 std::optional 是 C17 引入的一个模板类,用于表示可能缺失的值。它提供了一种安全的方法来处理可选值,允许变量在某些情况下没有值&#xff08…

git-repo系列教程(3) git-repo https证书认证问题

文章目录 问题描述解决步骤1.下载证书2.测试证书是否正常3.设置环境变量 总结 问题描述 在使用git repo 同步仓库时,发现不能同步,出现如下提示错误: % Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left …