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

Spring事务-新事务中的异常导致父事务中的回滚

Spring事务是Spring框架提供的一种用于管理数据库事务的机制。事务是指一组数据库操作,要么全部成功执行,要么全部回滚到初始状态,保证数据的一致性和完整性。

在Spring中,事务可以通过注解或编程方式进行管理。其中,注解方式是最常用的方式,通过在方法或类上添加@Transactional注解来声明事务的边界。

当在一个事务中存在多个嵌套的事务时,如果在子事务中发生异常并导致回滚,那么父事务也会被回滚。这种情况被称为"新事务中的异常导致父事务中的回滚"。

这种行为是由于Spring事务的默认传播行为(Propagation)设置为REQUIRED。REQUIRED表示如果当前存在事务,则加入该事务,如果不存在事务,则创建一个新事务。因此,当子事务发生异常导致回滚时,父事务也会受到影响。

为了解决这个问题,可以使用其他的传播行为设置,如REQUIRES_NEW。REQUIRES_NEW表示每次都创建一个新事务,如果当前存在事务,则将当前事务挂起。使用REQUIRES_NEW传播行为可以确保子事务的异常不会影响到父事务。

在Spring中,可以通过在@Transactional注解中设置propagation属性来指定传播行为。例如:

代码语言:txt
复制
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void nestedTransactionMethod() {
    // 子事务的操作
}

推荐的腾讯云相关产品:腾讯云数据库TencentDB、腾讯云云服务器CVM、腾讯云容器服务TKE、腾讯云函数计算SCF。

更多关于Spring事务的详细信息和腾讯云产品介绍,请参考以下链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JDBC事务

JDBC事务 首先,什么是 事务 ?  ...理解:防止出现未知错误,导致原先要执行完全数据只执行了一半,最终影响数据,也就是 事务是一组组合成逻辑工作单元操作,虽然系统可能会出错,但事务将控制和维护事务每个操作一致性和完整性。...这个时候,事务就是用来防止这种情况发生事务滚在这个场景用处简单来说就是 将张三扣除余额和李四增加余额,这两个操作绑定在一次,同时操作,这样就避免了当张三扣除余额后,李四余额每增加这种问题发生...JDBC Savepoint帮我们在事务创建检查点(checkpoint),这样就可以滚到指定点。当事务提交或者整个事务后,为事务产生任何保存点都会自动释放并变为无效。...1.在事务创建检查点 2.异常捕捉检查点并回滚到检查点 savepoint = conn.setSavepoint("检查点"); //设置检查点 conn.rollback(savepoint);

1.6K20
  • Spring@Transactional事务实例及源码

    Spring@Transactional事务实例及源码 一、使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用。...这种场景就可以使用@Transactional事物。...如果没有事务则开启一个事务。 SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务执行。...REQUIRESNEW:总是开启一个事务。如果一个事务已经存在,则将这个存在事务挂起。 MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动事务,则抛出异常。...NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常 NESTED:如果一个活动事务存在,则运行在一个嵌套事务。如果没有活动事务,则按REQUIRED属性执行。

    1.7K90

    Spring嵌套事务是怎么

    ,并给课程注册人数+1 为避免注册课程业务异常导致用户信息无法保存,这里 catch 注册课程方法抛出异常。...期待结果是即便内部事务regCourse()发生异常,外部事务saveStudent()俘获该异常后,内部事务应自行,不影响外部事务。 这是什么原因造成呢?...继续调用 processRollback() 该方法里区分了三种场景: 是否有保存点 是否为一个事务 是否处于一个更大事务 因为默认传播类型REQUIRED,嵌套事务并未开启一个新事务,所以属于当前事务处于一个更大事务...在 regCourse()异常,并触发回操作时,这个会继续传播,从而把 saveUser() 也,最终整个事务都被!...修正 Spring事务默认传播属性 REQUIRED,在整个事务调用链上,任一环节抛异常都会导致全局

    1.4K50

    springboot 事务,多张表操作事务

    实际情景如下: 删除一个导航,需要删除a表; 删除导航子模块需要删除b表; b表和c表有个关联关系表,需要删除c表关联关系 结果为a表数据删除成功了,b表数据未成功删除,这时候我们应该是b表数据...,a表数据也,那么我们应该怎么实现这种方式呢?...第一步,在springboot启动类上开启事务,注解 @EnableTransactionManagement 第二步:事务注解, @Transactional(rollbackFor = Exception.class...,都会产生事务,将之前添加或者修改数据进行。...特别提醒: 正常情况下加注解@Transactional和try catch捕获异常会让注解失效 解决办法就是在catch语句块添加TransactionAspectSupport.currentTransactionStatus

    3.3K40

    java spring事务方法、子方法各自问题处理

    java spring事务方法、子方法各自问题处理 问题描述 service实现类A方法(方法)调用B方法(子方法),两个方法均开启事务,且事务各自独立,A方法和B方法均可自行且相互之间各不干扰...A方法 注解@Transactional(rollbackFor = Exception.class) 开启A方法事务 其中: goodsService.importData3(); 调用B方法或者采用...SpringUtils.getAopProxy(this).importData3(); 调用B方法均可以,这里try catch B方法异常是为了防止B方法造成异常影响到A方法插入 代码如下:...; } B方法 注解@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)开启B方法事务...,且A方法与B方法不属于同一个事务 @Override @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW

    30510

    spring事务多种方式「建议收藏」

    1.代码事务控制3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动。优点就是可以灵活控制,缺点就是太麻烦了,太多重复代码了。...再说下声明式事务和注解事务原理:当被切面切中或者是加了注解方法抛出了RuntimeException异常时,Spring会进行事务。...下面说说我经常见到3种事务不回产生原因: (1)声明式事务配置切入点表达式写错了,没切中Service方法 (2)Service方法,把异常给try catch了,但catch里面只是打印了异常信息...,没有手动抛出RuntimeException异常 (3)Service方法,抛出异常不属于运行时异常(如IO异常),因为Spring默认情况下是捕获到运行时异常就回 3.如何保证事务...下面说几点保证事务方法 (1)如果采用编程式事务,一定要确保切入点表达式书写正确 (2)如果Service层会抛出不属于运行时异常也要能,那么可以将Spring默认异常修改为Exception

    2K40

    Spring事务两种方法

    当然,Spring事务前提是你当前使用数据库必须支持事务,比如MySQLInnodb是支持,但Mysaim则是不支持事务。...方法一 使用 @Transaction 来配置自动,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰方法无效,且该类必须是受spring所管控,也就是被已经被注入类...,则事务会被自动,除非你在该方法手动捕获了异常,且没有抛出新异常。...可以使用 @Transactional(rollbackFor = Exception.class) 来设定针对特定异常进行事务,如果不设置则默认会 RuntimeException and...} } 复制代码 方法二 通过注入 DataSourceTransactionManager 来手动开启事务,手动事务,用于抛出异常被catch后,进行手动,可控程度更高,可以更灵活使用。

    1.1K10

    Spring事务

    Spring事务 配置事务 spring配置文件 <?xml version="1.0" encoding="UTF-8"?...Spring事务传播特性(propagation 属性) REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。...这是最常见选择。 SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。...(4)一旦客户端B事务因为某种原因,所有的操作都将会被撤销,那客户端A查询到数据其实就是脏读数据。 2、读提交 就是一个事务要等另一个事务提交后才能读取数据。...因为幻读问题对应是插入INSERT操作,而不是UPDATE操作 (5)重新打开客户端B,插入一条数据后提交; (6)在客户端A查询表account所有记录,没有 查出 新增数据,所以没有出现幻读

    42520

    Redis-10Redis事务

    文章目录 概述 场景一: 命令格正确,数据类型错误 场景二:命令格式错误 总结 概述 对于 Redis 而言,不单单需要注意其事务处理过程,其能力也和数据库不太一样,这也是需要特别注意一个问题一...Redis 事务遇到命令格式正确而数据类型不符合 ,如下所示。...,说明被 Redis 事务滚了。...---- 总结 通过上面两个例子,可以看出Redis在执行事务命令时候,在命令入队时候, Redis 就会检测事务命令是否正确,如果不正确则会产生错误。...无论之前和之后命令都会被事务,就变为什么都没有执行。 当命令格式正确,而因为操作数据结构引起错误 ,则该命令执行出现错误,而其之前和之后命令都会被正常执行。

    87730

    Try-Catch包裹代码异常后,竟然导致了产线事务

    导读:一段被try-catch包裹后代码在产线稳定运行了200天后忽然发生了异常,而这个异常竟然导致了产线事务。这期间究竟发生了什么?日常在项目过程该如何避免事务异常?...02 我们来看一下这段导致了产线事务代码,类似于下面这样: @Transactional public void main() { // 假设有多个user操作,需要事务控制...可能有的人和我第一反应一样,是不是最后userOtherProcess方法执行异常造成了methodA事务?...也安排到了这个房间,methodB虽然发生了异常且被try-catch包裹,但逃不过监事火眼金睛,于是他按下了事务按钮。...Spring捕获异常后,正如我们所猜测事务将会被设置全局rollback,而最外层事务方法执行commit操作,这时由于事务状态为rollback,Spring认为不应该commit提交事务,而应该回事务

    1.4K20

    Spring事务嵌套事务实现和示例

    Spring事务,嵌套事务是通过事务传播行为和可选事务管理器来实现。...嵌套事务是指一个事务包含了另一个事务,在外层事务范围内,内层事务可以单独进行提交或,并且外层事务提交或不会受到内层事务影响。...// ... }}在上述代码,外层事务由outerMethod()方法表示,并通过@Transactional注解来定义事务属性。...在执行到innerService.innerMethod()时,会调用内层服务innerMethod()方法,此时内层事务会在外层事务范围内开启。...在内层事务执行过程,如果发生异常,内层事务会被,但外层事务仍然继续执行。最后,根据外层事务提交或决定是否将外层事务及其包含内层事务一起提交或

    66191

    SpringMVC事务异常

    异常 首先了解一下异常组成: RuntimeException() 例如:数组越界异常、空指针异常、(我们在编写之后不会提示让 try catch异常、代码编写错误导致,可避免) 非RuntimeException...() Spring事务机制 Spring通过异常进行事务机制: Spring 默认事务机制,当出现unchecked异常时候,checked异常时候不会; 我们有时为了打印日志...为了事务正常生效:当有try catch后捕获了异常事务不会, 如果不得不在service层写try catch 需要catch后 throw new RuntimeException 让事务...所以我们service层在添加了try catch日志打印后,抛出runtime类异常需要在controller层进行捕获,捕获之后,在catch编写操作失败后返回值信息。...异常捕获机制进行事务,通过手动session.rollback进行异常捕获后事务也可。

    63510

    PostgreSQLclog—从事务速度谈起

    看到这里,就可以明白,只要事务提交时候,设置状态为已提交,而事务时候,设置状态为已中断,就可以达到目的,的确避免了操作数百万行事务突然要回时候巨大代价。...事务提交与时候clog操作 ---- 首先来说提交。...在PG这个地方,子事务概念主要指:事务从开始到结束,期间可以savepoint,之后rollback到savepoint而不是事务起点,在实际情况多有应用,因此这里事务与子事务(比如事务最终提交,...但期间有情况,或者事务期间多次save point)必须尽可能原子性方式写入,否则事务可见性就会出现问题。...首先,写入的当时,事务没有结束时候,必然是”执行”这个状态。当事务之后提交,或者回时候,pg是必然不会回头改这个标记,否则无论提交还是,都是一个代价巨大事情。

    1.6K20

    Spring事务专题(四)Spring事务使用、抽象机制及模拟Spring事务实现

    `,新增了两个事务属性 // 用于指定事务使用事务管理器名称 String getQualifier(); // 指定在出现哪种异常时才进行 boolean rollbackOn(Throwable...允许程序员自己定义异常,如果没有指定异常,默认「抛出RuntimeException/Error才进行」 TransactionStatus 这个接口主要用于描述Spring事务状态,...事务管理一个标准流程 判断当前是否已经存在一个事务 应用合适事务传播行为 在必要时候挂起/恢复事务 提交时检查事务是否被标记成为rollback-only 在时做适当修改(是执行真实/...Spring事务同步机制 Spring事务相关同步机制可以分为两类 资源同步 行为同步 什么是资源同步呢?...// 1 // 2 异常状态,例如在事务执行时出现异常,然后时又出现异常 // 就会被标记成状态2 int STATUS_COMMITTED = 0; int STATUS_ROLLED_BACK

    96820

    哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务

    更多Spring事务问题请访问链接:Spring事务疑难详解 一,为什么框架根本没有对Exception一般子类进行配置,异常发生时,事务都进行了 ,说好只会对RuntimeException...受检异常(Checked)一般在编译期就被检出,这就给你造成了一个Spring对于所有异常都会发生误解。...下面给出一些受检CHECKED异常: 二,为什么我在执行方法时候出现了SQL执行Exception,默认配置情况下,事务还是发生了 ?...,属于CHECKED受检异常事务是不会因为它发生!...RuntimeException子类 得出结论:Spring框架下,所有SQL异常都被org.springframework重写为RuntimeException,事务因此也会发生

    1.1K40

    咦,为什么我事务不了?

    MySQL 事务小伙伴们都懂,通过 begin 开启事务,通过 commit 提交事务或者通过 rollback 事务。...。 再次查询数据。 到第六步时候,我们发现查询到数据只剩三条了,说明第五步并没有生效。原因就在于执行 alter 之前,事务已经被隐式提交了。...对于上面的案例,如果大家去掉第四步 alter,那么是可以滚成功,这个小伙伴们自己来测试,我就不演示了。...我举个简单例子: 可以看到,跟第一小节测试步骤一样,只不过第四步换成一个 GRANT 语句,那么最终事务也会失效,原因就在于事务已经提交了。...新事务开启 一个事务还没提交,结果你又开启了一个事务,那么此时前一个事务也会隐式提交。看个例子: 这个好理解,不多说。 4. 各种锁操作 给表上锁、解锁也会导致事务隐式提交。

    97820
    领券