首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

聊聊springUnexpectedRollbackException

,内层事务抛出了异常,外层事务给catch住了,然后试图提交事务报错示例 @Transactional public Customer createWithCatch(String name...throwExInTx抛出了异常,而外层事务createWithCatch给catch住了,最后提交事务则报UnexpectedRollbackException异常源码解析invokeWithinTransactionorg...rollbackOnly外层事务processCommitorg/springframework/transaction/support/AbstractPlatformTransactionManager.java...true了,因而unexpectedRollback为true小结UnexpectedRollbackException继承了TransactionException,一般是事务嵌套,内层事务抛出了异常...,外层事务给catch住了,然后试图提交事务报错UnexpectedRollbackException(Transaction silently rolled back because it has been

26110

聊聊springUnexpectedRollbackException

,内层事务抛出了异常,外层事务给catch住了,然后试图提交事务报错 示例 @Transactional public Customer createWithCatch(String name...throwExInTx抛出了异常,而外层事务createWithCatch给catch住了,最后提交事务则报UnexpectedRollbackException异常 源码解析 invokeWithinTransaction...rollbackOnly 外层事务processCommit org/springframework/transaction/support/AbstractPlatformTransactionManager.java...true了,因而unexpectedRollback为true 小结 UnexpectedRollbackException继承了TransactionException,一般是事务嵌套,内层事务抛出了异常...,外层事务给catch住了,然后试图提交事务报错UnexpectedRollbackException(Transaction silently rolled back because it has been

22810
您找到你想要的搜索结果了吗?
是的
没有找到

Spring声明式与编程式事务区别,事务与非事务方法相互调用导致事务不生效问题

如果没有一个活动事务,则抛出异常。 4 NESTED 如果一个活动事务存在,则运行在一个嵌套事务中。...,成为a()嵌套事务 NEVER b()不创建自己事务; b()报异常 REQUIRES_NEW b()创建自己事务; b()不接受a()事务,b()先执行,内层事务失败不会影响外层事务...如果你看过我之前源码分析文章应该知道,在处理回滚时有这么一段代码 rollBackOnly 设置 在提交时又做了下面这个判断(这个方法我删掉了一些不重要代码) commit_rollbackOnly...可以看到当提交时发现事务已经被标记为 rollbackOnly 后会进入回滚处理中,并且 unexpected 传入为 true。...」,所以即使我们在外部事务中 catch 了抛出异常,整个事务仍然无法正常提交,并且如果你希望正常提交,Spring 还会抛出一个异常

1.1K41

一个@Transaction哪里来这么多坑?

❝Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 异常)或者 Error才回滚事务;其他异常不会触发回滚事务,已经执行SQL会提交掉。...按照这种思路,虽然IndexServicea方法抛出了异常,但是我们在testRollbackOnly将异常捕获了,那么这个事务应该是可以正常提交,为什么会抛出异常呢?...如果你看过我之前源码分析文章应该知道,在处理回滚时有这么一段代码 ? rollBackOnly设置 在提交时又做了下面这个判断(这个方法我删掉了一些不重要代码) ?...commit_rollbackOnly 可以看到当提交时发现事务已经被标记为rollbackOnly后会进入回滚处理中,并且unexpected传入为true。在处理回滚时又有下面这段代码 ?...catch了抛出异常,整个事务仍然无法正常提交,并且如果你希望正常提交,Spring还会抛出一个异常

93240

Spring5源码之Spring七种传播特性详解

方法中catch代码块中,处理完异常后,还通过 throw ex;将异常抛给了上层,所以上层要catch住子事务异常,子事务回滚后,上层事务也会回滚)**,而只要自己提交了之后,就算上一个事务后面的逻辑报错...,自己是不会回滚,(因为被标记为事务,所以在提交阶段已经提交了)。...前面说到,如果是旧事务的话回滚是不会执行,但先看看它status,虽然标记为事务,但它还有savePoint如果有savePoint,会回滚到保存点去,提交时候会释放保存点,但是不提交!...在提交时不真正提交,只是释放了保存点而已,在回滚时会回滚到保存点位置,如果上层事务catch住异常的话,是不会影响上层事务提交,外层事务提交时,会统一提交,外层事务回滚的话,会全部回滚 5....中holder里是否被标记了rollback了,外层事务回滚,将会标记holder,而holder是线程变量,在此传播特性中holder是同一个对象,外层事务无法正常提交而进入processRollback

12620

【小家Spring】源码分析Spring事务拦截器:TransactionInterceptor和事务管理器:PlatformTransactionManager

; // 如果为给定事务打开了新事务同步 该值为true private final boolean newSynchronization; // 该事务是否标记为了只读 private final...实现Spring标准事务工作流 这个基类提供了以下工作流程处理: 确定如果有现有的事务; 应用适当传播行为; 如果有必要暂停和恢复事务; 提交时检查rollback-only标记; 应用适当修改当回滚...`失败后`将 现有事务`全局`标记为回滚 默认值是true 需要注意~~~ // 表示只要你事务失败了,就标记此事务为rollback-only 表示它只能给与回滚 而不能再commit或者正常结束了...true了 // isGlobalRollbackOnly:是否标记为了全局RollbackOnly if (!...) 若是true,每次操作都被认为是一次提交 手动提交事务:con.commit(); 出现异常时回滚,不一定在catch语句中,只要在con.commit()前需要回滚时执行都可:con.rollback

4.6K32

Spring事务回滚和提交你真的明白了吗,本篇文章带你走近源码。干货满满

回滚时候将会标记为回滚标识,我们先来看看是怎么标记。...= true; } 我们看到将status中Transaction中ConnectionHolder属性rollbackOnly属性设置为true,这里暂时不多考虑,等到下面提交时候再介绍。...** 事务提交事务执行没有出现任何异常,也就意味着事务可以走正常事务提交流程,这里回到流程中,看看TransactionAspectSupport类中commitTransactionAfterReturning...,回滚时候,并不执行回滚,只是标记一下回滚状态,当外层事务提交时候,会先判断ConnectionHolder中回滚状态,如果已经标记为回滚,则不会提交,而是外层事务进行回滚。...,如果子事务没有回滚,将由外层事务一次性提交 如果程序流通过了事务层层把关,最后顺利进入了提交流程,那么同样,Spring会将事务提交操作引导至底层数据库连接API,进行事务提交

86310

Spring事务王国概览

所有应用程序提交事务请求,都需要通过TP Monitor调配之后,直接由TM统一管理,TM将使用两阶段提交协议来协调多RM之间事务处理。...如果直接使用JDBC进行数据访问的话,我们可以将数据库连接自动提交设置为false,改为手动提交来控制整个事务提交或者回滚。...并且缺乏统一事务异常管理体系。 不同数据源提供事务管理api不同,因此需要一个更高级抽象,帮助我们统一事务管理API。...注意,事务开启前要取消当前连接自动提交事务结束后,要恢复当前连接自动提交 上面这种事务管控方式最大问题在于事务代码无法摆脱connection束缚,导致connection与当前业务代码耦合...true,如果最外层事务已经被标记为rollbackonly,那么就进行回滚 if (!

52410

Spring嵌套事务是怎么回滚

,并给课程注册人数+1 为避免注册课程业务异常导致用户信息无法保存,这里 catch 注册课程方法中抛出异常。...期待结果是即便内部事务regCourse()发生异常,外部事务saveStudent()俘获该异常后,内部事务应自行回滚,不影响外部事务。 这是什么原因造成呢?...,如下: 检查是否需要创建事务 调用具体业务方法进行处理 提交事务 处理异常 当前案例是两个事务嵌套,外层事务 saveUser()和内层事务 regCourse(),每个事务都会调用到这个方法。...继续调用 processRollback() 该方法里区分了三种场景: 是否有保存点 是否为一个新事务 是否处于一个更大事务中 因为默认传播类型REQUIRED,嵌套事务并未开启一个新事务,所以属于当前事务处于一个更大事务中...外层事务 外层事务中,业务代码就捕获了内层所抛异常,所以该异常不会继续往上抛,最后事务会在 TransactionAspectSupport.invokeWithinTransaction() 中

1.4K50

JPAHibernate问题汇总

解决方法二 因为该懒加载异常是缺少session导致,那么可以通过在方法前添加事务注解@Transactional方式来解决,只要事务没有提交,session就不会关闭,自然就不会出现上述懒加载异常...当方法A继续执行完毕,在最后提交事务时,会发现当前事务已经被标记为rollback-only状态,于是整个事务回滚并抛出UnexpectedRollbackException异常。...在这种情况下,一般有两种处理场景: 只有方法B在遇到异常事务回滚,且不影响到方法A事务提交,那么此时方法B事务要指明为PROPAGATION_NESTED。...但是,JPA默认实现是Hibernate,而Hibernate不提供事务嵌套。...对于这种情况,要么使用其他JPA实现,要么在方法B中将可能发生异常try-catch并且不往外抛出,但此时方法B将不能自动事务回滚。 方法B发生异常时,和方法A一起事务回滚。

2.4K20

Spring事务专题(五)聊聊Spring事务到底是如何实现

,如果仅仅是嵌套事务发生了异常,会回滚到之前设置这个保存点上。...另外需要注意是,因为是直接复用了外部事务连接,所以supports、required、mandatory、nested这几种传播级别下,嵌套事务会随着外部事务提交提交,同时也会跟着外部事物回滚而回滚...在后续事务提交跟回滚时会根据事务状态对象中这两个属性来判断是否需要真正执行回滚,如果不存在真正事务,那么也就没有必要去回滚(当然,这只是针对内部事务而言,如果抛出异常同时中断了外部事务,那么外部事务还是会回滚...txObject.getConnectionHolder().clear(); } 5、提交事务提交事务有两种情况 正常执行完成,提交事务 出现异常,但是不满足回滚条件,仍然提交事务...rollbackOnly // 之前我们在分析回滚代码时知道,当内部事务发生回滚时(supports、required) // 默认情况下会将整个事务对象标记为回滚,实际上在外部事务提交时就会进入这个判断

1.2K10

springboot @Transactional概念以及实战

工作原理是基于AOP(面向切面编程),在被注解方法被调用时创建一个事务,并在方法执行结束时根据执行情况提交或回滚事务。如果方法正常完成,事务将被提交;如果方法抛出运行时异常事务将被回滚。...优点简化事务管理:@Transactional提供了一种声明式方式来管理事务,这意味着开发者可以不必手动控制事务开启、提交或回滚,简化了代码和减少了错误可能性。...整合支持:与Spring框架其他部分(如JPA、Hibernate)紧密整合,提供了跨多种数据库和ORM技术一致性事务支持。...传播行为误用:事务传播行为如果设置不当,可能会导致意想不到事务行为。例如,嵌套事务和不同传播行为组合可能会复杂化事务管理,增加出错风险。...测试复杂性:在单元测试中模拟事务行为可能比较困难,特别是在使用内存数据库或不完全支持嵌套事务数据库时。

26821

Spring JDBC-Spring对事务管理支持

因为后者不能获得和本线程相关资源,因此无法让数据操作参与到本线程相关事务环境中。 这些工具类还有另外一个重要用途:将特定异常转换为SpringDAO异常。...Service接口方法以共同完成一个完整业务操作,因此就会产生服务接口方法嵌套调用情况, Spring通过事务传播行为控制当前事务如何传播到被嵌套调用目标服务接口方法中。...PROPAGATION_MANDATORY 使用当前事务,如果当前没有事务,就抛出异常。...内嵌事务是内层事务一 部分,所以只有外层事务提交时,嵌套事务才能一并提交嵌套事务不能够提交,它必须通过外层事务来完成提交动作,外层事务回滚也会造成内部事务回滚。..., 而 PROPAGATION_NESTED 将创建一个依赖于外层事务事务,当外层事务提交或回滚时,子事务也会连带提交和回滚。

58120

springboot事物oracle,SpringBoot 事务管理

所以我们不需要任何配置就可以使用@Transactional注解来进行事务使用。我习惯使用jdbc,虽然Jpa有各种各样优点(真的不太会用)。...一般情况下,我们会对Service层方法开启事务,也就是说Controller -> Service 调用顺序中,如Service执行成功,Controller中出现异常事务无法回滚。...未提交读):一个事务可以读取另一个事务修改但未提交数据;不可避免脏读、不可重复读、幻读; READ_COMMITTED(已提交读):一个事务可以读取另一个事务已经提交数据;可避免脏读,不可避免不可重复读...事务传播行为 事务传播行为指的是,由某个事务传播行为(propagation)修饰方法被嵌套进另一个方法中时,事务是如何传播。...; NEVER:非事务方式运行,如当前存在事务,则抛出异常; NESTED:如当前存在事务,则创建一个事务作为当前事务事务运行,随当前事务一起提交,当前事务回滚子事务也回滚,子事务可以独立回滚,当前事务不会回滚

59810

面试官:说说Spring中事务传播行为

事务传播行为是Spring框架提供一种事务管理方式,它不是数据库提供。不知道大家是否听说过“不要在service事务方法中嵌套事务方法,这样会提交多个事务说法,其实这是不准确。...mandatory中文是强制性意思,表明了被修饰方法,一定要在事务中去调用,否则会抛出异常。...根据定义,inserBatch事务会被延缓。具体表现就是:后面的10次循环事务在每次循环结束之后都会提交自己事务,而inserBatch事务,要等循环方法走完之后再提交。...NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。...由于本人使用Spring Data JPA 进行演示代码,使用嵌套事务会提示: org.springframework.transaction.NestedTransactionNotSupportedException

89210

面试官:说说Spring中事务传播行为

事务传播行为是Spring框架提供一种事务管理方式,它不是数据库提供。不知道大家是否听说过“不要在service事务方法中嵌套事务方法,这样会提交多个事务说法,其实这是不准确。...mandatory中文是强制性意思,表明了被修饰方法,一定要在事务中去调用,否则会抛出异常。...根据定义,inserBatch事务会被延缓。具体表现就是:后面的10次循环事务在每次循环结束之后都会提交自己事务,而inserBatch事务,要等循环方法走完之后再提交。...NEVER 以非事务方式运行,如果当前存在事务,则抛出异常。...由于本人使用Spring Data JPA 进行演示代码,使用嵌套事务会提示: org.springframework.transaction.NestedTransactionNotSupportedException

13610

分布式事务之Spring事务与JMS事务(二)

Spring在TransactionDefinition接口中规定了 7 种类型事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型: 事务传播行为类型 说明...另外四个与JDBC隔离级别相对应 ISOLATION_READ_UNCOMMITTED: 这是事务最低隔离级别,它充许令外一个事务可以看到这个事务提交数据。...ISOLATION_READ_COMMITTED: 保证一个事务修改数据提交后才能被另外一个事务读取。...JPA事务管理过程: [enoepl3el2.png] 在整个事务管理过程中使用是Spring事务控制,并且由相关ORM框架实现JPA规范 JMS事务原理 Spring JMS Session...此种事务处理方式不存在对应用服务器依赖,因而部署灵活却无法支持多数据源分布式事务

1.9K10

Spring事务@Transactional深度讲解

事务,并调用了真实方法; aop代理对象得到方法执行情况作出提交或回滚操作。...,总体逻辑是先执行一些真实方法前置切面,再执行真实方法,如果有异常就进行处理(事务回滚),如果没有异常提交事务,并执行后置增强方法。...异常集成关系图,如下: ? 由上图可以看出像IO,SQL异常如果不进行特定处理是不会进行事务回滚。...().setRollbackOnly(); 点进去源码可以看到,事务状态默认是false(提交意思),调用此方法后,则改成true(回滚) public abstract class AbstractTransactionStatus...= true; } ……………… 由此,综上所述,spring事务回滚原因有两个: 抛出异常是非运行时异常RuntimeException; 事务状态被人为修改。

96510
领券