Spring中@Transactional事务回滚实例及源码 一、使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用。...这种场景就可以使用@Transactional事物回滚。...String string = null; if(string.equals("")) { int i = 0; } } 上面的方法我故意让其出现空指针异常,会事物回滚...本文最终源码下载: http://download.csdn.net/detail/u013142781/9381184 四、Spring中的@Transactional必须要了解的概念 Spring中的...NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。
源码解析 伪代码梳理整个事务的结构: 整个业务包含2层事务: 外层 saveUser() 的事务 内层 regCourse() 事务 Spring声明式事务中的propagation属性,表示对这些方法使用怎样的事务...在 regCourse()中抛异常,并触发回滚操作时,这个回滚会继续传播,从而把 saveUser() 也回滚,最终整个事务都被回滚!...修正 Spring事务默认传播属性 REQUIRED,在整个事务的调用链上,任一环节抛异常都会导致全局回滚。...这意味着此时Spring 只对注册课程这部分的数据进行了回滚,并没有传播到外层: 当子事务声明为 Propagation.REQUIRES_NEW 时,在 TransactionAspectSupport.invokeWithinTransaction...,让这个子事务单独回滚,不会影响到主事务。
当然,Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的。...方法一 使用 @Transaction 来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类...,则事务会被自动回滚,除非你在该方法中手动捕获了异常,且没有抛出新的异常。...可以使用 @Transactional(rollbackFor = Exception.class) 来设定针对特定的异常进行事务回滚,如果不设置则默认会回滚 RuntimeException and...} } 复制代码 方法二 通过注入 DataSourceTransactionManager 来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚,可控程度更高,可以更灵活的使用。
1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚。优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了。...当然,事务不回滚的都是采用的声明式事务或者是注解事务;编程式事务都是自己写代码手动回滚的,因此是不会出现不回滚的现象。...再说下声明式事务和注解事务回滚的原理:当被切面切中或者是加了注解的方法中抛出了RuntimeException异常时,Spring会进行事务回滚。...,没有手动抛出RuntimeException异常 (3)Service方法中,抛出的异常不属于运行时异常(如IO异常),因为Spring默认情况下是捕获到运行时异常就回滚 3.如何保证事务回滚...下面说几点保证事务能回滚的方法 (1)如果采用编程式事务,一定要确保切入点表达式书写正确 (2)如果Service层会抛出不属于运行时异常也要能回滚,那么可以将Spring默认的回滚时的异常修改为Exception
kill掉,触发MySQL的事务回滚动作。...然后,另开一个窗口 多次执行刚才创建的function, 入参2个,第一个是连接id,第二个是sleep的秒数 [test]> select RollbackTimeCalc(136,5); +---...| +-------------------------+ 1 row in set (5.00 sec) 可以看到 Estimation Time of Rollback (回滚需要的时间...)在不断的变小,直到最后返回结果为NULL。...更详细的操作和实践,可以参考原文: https://mydbops.wordpress.com/2022/02/07/estimating-time-for-rollback-operation/
2.使用 isolation 指定事务的隔离级别, 最常用的取值为 READ_COMMITTED。 3.默认情况下 Spring 的声明式事务对所有的运行时异常进行回滚....若真的是一个只读取数据库值的方法, 应设置 readOnly=true。 5.使用 timeout 指定强制回滚之前事务可以占用的时间。...,即数据库中1001的库存还是减少了1。...设置timeout指定强制回滚的时间。我们在purchase里面加上休眠,此时休眠2s<3s。 并将数据库中数据重新设置为: ? ? 此时我们测试testBookShopService,结果为: ?...虽然我们的余额还可以再买一本,但是强制回滚的时间=3s的时间,所以进行强制回滚。
这种场景就可以使用@Transactional事物回滚。...checked异常: 表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。 必须在代码中显式地处理。...String string = null; if(string.equals("")) { int i = 0; } } 上面的方法我故意让其出现空指针异常,会事物回滚...: 四、Spring中的@Transactional必须要了解的概念 Spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便快捷解决在开发中碰到的问题。...NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。
Spring事务的提交和回滚机制如下:提交机制:Spring事务的默认提交机制是自动提交。当事务方法顺利执行完成(没有抛出异常)时,Spring会自动将事务提交到数据库中保存。...这意味着对数据库的操作会永久保存。回滚机制:Spring事务的回滚机制可以分为两种情况:未检查异常(unchecked exception):当事务方法抛出未检查异常时,Spring会自动回滚事务。...在发生未检查异常时,事务将回滚并数据库中的操作将被撤销。检查异常(checked exception):当事务方法抛出检查异常时,默认情况下Spring不会自动回滚事务。...这是因为检查异常通常表示一个业务逻辑错误,可能是临时的或者可以修复的。如果想要让Spring也回滚事务,可以使用@Transactional注解的rollbackFor属性指定需要回滚的异常类型。...,Spring事务会根据异常类型是否为检查异常以及是否配置了回滚异常类型来决定是否回滚事务。
错误处理和回滚:事务管理使得在发生错误时能够回滚事务,确保数据的完整性,以及在异常情况下进行适当的错误处理。...Spring 事务的关键概念包括: 事务管理器(Transaction Manager):事务管理器是 Spring 提供的一个接口,用于管理事务的开始、提交和回滚操作。...2.3 事务定义和注解 在 Spring 中,事务定义(Transaction Definition)用于定义事务的属性,如隔离级别、传播行为、超时设置等。...这会触发Spring事务管理器的回滚机制,导致之前的数据库操作被撤销,从而恢复到事务开始之前的状态。...通过事务回滚机制,如果在转账过程中发生异常,例如转出账户余额不足,所有的数据库操作都会被回滚,确保数据的一致性。这样可以避免转账过程中数据发生不一致的情况。
引言 在 Spring 中,bean 往往不会独立存在,bean 的相互依赖是极为常见的。...,当 Spring 要创建 A 对象时,必须以 B 对象作为参数,随着 A 对象的创建,A 依赖的 B 对象也就被注入到了 A bean 中,正如上面的例子,它也同样可能存在循环依赖。...那么,如何来解决循环依赖呢? 3. 循环依赖的解决办法 在 Spring 的设计中,已经预先考虑到了可能的循环依赖问题,并且提供了一系列方法供我们使用。下面就一一来为您介绍。...我们最先做的应该是去审视整个项目的层次结构,去追问循环依赖是不是必然产生的。通过重新设计,去规避循环依赖的过程中,可能实际上是去规避了更大的隐患。...总结 本文介绍了在 Spring 使用过程中,避免循环依赖的处理方法。这些方法通过改变 bean 对象的实例化、初始化的时机,避免了循环依赖的产生,它们之间有着微妙的差别。
上一篇文章讲解了获取事务,并通过获取的connection设置只读,隔离级别等;这篇文章讲事务剩下的回滚和提交。 事务的回滚处理 之前已经完成了目标方法运行前的事务准备工作。...,那么Spring就会将程序引导至回滚处理函数中。...常用于单独事务的处理。对于没有保存点的回滚,Spring同样是使用底层数据库连接提供的API来操作的。...,回滚的时候,并不执行回滚,只是标记一下回滚的状态,当外层事务提交的时候,会先判断ConnectionHolder中的回滚状态,如果已经标记为回滚,则不会提交,而是外层事务进行回滚。...,如果子事务没有回滚,将由外层事务一次性提交 如果程序流通过了事务的层层把关,最后顺利的进入了提交流程,那么同样,Spring会将事务提交的操作引导至底层数据库连接的API,进行事务提交。
在努力通知型分布式事务中,当发生异常时,可以通过以下步骤来处理事务的回滚操作:事务管理器收到异常通知后,首先会发送回滚请求给参与事务的各个分支。...分支事务接收到回滚请求后,会执行本地事务的回滚操作,确保数据的一致性。事务管理器等待所有分支事务返回回滚结果。如果所有分支事务都成功回滚,事务管理器将返回回滚成功的消息给应用程序。...如果有任何一个分支事务回滚失败,事务管理器将返回回滚失败的消息给应用程序。应用程序可以根据回滚成功或失败的消息进行相应的处理,如记录日志、进行错误处理等。...分支事务在执行过程中必须具有一致性保证。如果分支事务执行的中间结果已经对其他分支事务或外部系统产生了影响,则回滚操作可能无法完全还原数据的一致性。事务管理器必须能够正确地接收异常通知并发送回滚请求。...在分布式系统中,异常通知和回滚请求的传递必须可靠,以确保所有参与事务的分支都能够正确地执行回滚操作。以上是努力通知型分布式事务中处理事务回滚的一般流程和前提条件。
题目 Oracle数据库中,以下哪个命令可以删除整个表中的数据,并且无法回滚() A、DROP B、DELETE C、TRUNCATE D、CASCADE A 答案 答案:C。...、约束、触发器和索引SQL命令类型DDL语句,隐式提交,不能对TRUNCATE和DROP使用ROLLBACK命令DML语句,事务提交(COMMIT)之后才生效,可以使用ROLLBACK语句撤销未提交的事务删除的数据是否放入回滚段...(ROLLBACK SEGMENT)否否是高水位是否下降是是,在宏观上表现为TRUNCATE操作后,表的大小变为初始化的大小否,在宏观上表现为DELETE后表的大小并不会因此而改变,所以,在对整个表进行全表扫描时...,经过TRUNCATE操作后的表比DELETE操作后的表要快得多日志的产生少量日志少量日志大量日志是否可以通过闪回查询来找回数据否否是是否可以对视图进行操作是否是级联删除不能DROP一个带有ENABLE...备份、DUL工具等闪回查询、闪回事务、闪回版本、闪回数据库等 About Me:小麦苗 ● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用 ● 作者博客地址:http://blog.itpub.net
⌨ 详细介绍:Spring Boot 中的单元测试 前言 在这篇文章中,我们将深入介绍如何在 Spring Boot 中进行单元测试,以及一些常用的工具和技巧。...我们将侧重于以下几个方面: Service 层单元测试 Controller 层单元测试 使用新的断言 assertThat 单元测试中的事务回滚 让我们一一来探讨这些内容!...单元测试回滚 在单元测试过程中,如果你不想在数据库中留下垃圾数据,你可以开启事务功能,方法或类头部添加 @Transactional 注解即可: @Test @Transactional public...总结 在本文中,我们深入了解了如何在 Spring Boot 中进行单元测试,并介绍了一些常用的工具和技巧,如 MockMvc 和 assertThat。...同时,我们还讨论了如何在单元测试中使用事务回滚,以保持数据库的干净和一致。 希望这篇文章对你有所帮助,如果你有任何疑问或需要进一步的解释,请随时告诉我。
@Transactional注解是Spring事务管理的核心部分之一。它使得你可以将方法标记为事务性的,以确保在方法执行时,如果发生异常,相关操作会被回滚,保持数据的完整性。...事务管理器 Spring框架使用事务管理器来处理事务。具体来说,你可以配置一个事务管理器(如JDBC事务管理器或Hibernate事务管理器),以指定事务的处理方式。...Spring提供了不同的传播行为选项,包括REQUIRED、REQUIRES_NEW、NESTED等等。这些选项允许你根据业务需求精细地配置事务的行为,确保整个操作链的一致性。...Spring会创建一个代理对象,该代理对象包装了被注解标记的方法,以实现事务管理。在方法执行前后,代理对象会拦截方法调用,开启、提交或回滚事务。...我们使用了**@Transactional**注解,以确保整个操作要么全部成功,要么全部回滚。
Spring 事务传播机制是指,包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。...LogService 保存日志程序报错,因为使用的是 UserController 中的全局事务,所以整个事务回滚,步骤 1 中的操作也跟着回滚。 所以数据库中没有添加任何数据。...UserService 中调用了 LogService 的添加方法,LogService 使用了 NESTED 循环嵌套事务,但在方法执行中出现的异常,因此回滚了当前事务。...因为 UserService 使用的是嵌套事务,所以发生回滚的事务是全局的,也就是说 UserService 中的添加用户方法也被回滚了,最终执行结果是用户表和日志表都没有添加任何数据。...总结 Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。
这样就完成了事务配置,就可以在Spring使用事务的回滚或者提交功能了。 这个 saveList 方法就在Spring事务的控制之下,如果发生了异常,就会回滚事务。...如果各位知道更多的Spring的事务特性,可以在注解中配置,比如什么异常才能回滚,比如超时时间,比如隔离级别,比如事务的传播。就更有利于理解今天的文章了。...可以说,该方法就是Spring 事务的核心调用,根据目标方法是否有异常进行事务的回滚。 那么,我们需要一行一行的看看该方法实现。 首先看事务的属性。 2....该方法主要内容在红框中,首先判断该事务对象是否和该异常匹配,如果匹配,则回滚,否则,则提交。那么,是否匹配的逻辑是怎么样的呢?我们的事务属性是什么类型的?...RuleBasedTransactionAttribute ,就是我们刚刚创建解析注解后创建的。那么我就看看该类的 rollbackOn 方法: 首先,循环解析注解时添加进集合的回滚元素。
谈谈对循环依赖的理解 什么是循环依赖? 因为spring中bean都是单例的,当两个对象持有对方的属性的时候,会造成一个循环依赖。...spring事务时如何回滚的? spring的事务管理是如何实现的?...执行具体的sql逻辑操作 在操作的过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚具体的逻辑是通过doRollBack方法来实现的...spring事务回滚规则 指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务。...默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚
其实spring ioc内部的三级缓存保证了它,不会出现循环依赖问题。但有些坑,如果你想进一步了解循环依赖问题,可以看看我之前文章《spring:我是如何解决循环依赖的?》。...3.手动抛了别的异常 即使开发者没有手动捕获异常,但如果抛的异常不正确,spring事务也不会回滚。...因为spring事务,默认情况下只会回滚RuntimeException(运行时异常)和Error(错误),对于普通的Exception(非运行时异常),它不会回滚。...4.自定义了回滚异常 在使用@Transactional注解声明事务时,有时我们想自定义回滚的异常,spring也是支持的。可以通过设置rollbackFor参数,来完成这个功能。...所以,这种情况是直接回滚了整个事务,不只回滚单个保存点。 怎么样才能只回滚保存点呢?
领取专属 10元无门槛券
手把手带您无忧上云