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

TCC的异常场景及应对机制

从上图中红色部分可以看到:如果当TC调用参与者的二阶段方法时,发生了异常(TC本身异常或者网络异常丢失结果)。此时TC无法感知到调用的结果。...紧接着,在实际调用参与者的Try方法时发生了异常。异常原因可以是发起方宕机,网络抖动等。 总而言之,就是Try方法没有执行成功,然而此时这笔分布式事务和分支事务已经落库。...有两种情况会触发分布式事务的回滚: 发起方认为当前分布式事务无法成功,主动通知TC回滚 TC发现分布式事务超时,被动触发回滚 触发回滚操作后,TC会对该分布式事务关联的分支事务调用其二阶段Cancel。...上一节中提到过空回滚,指的是当一阶段Try未执行成功,而二阶段Cancel就因TC回滚整个分布式事务而被调用。...由于悬挂的产生背景是一阶段方法根本就未执行,所以此时事务控制记录是不存在的,需要在二阶段中处理ROLLBACK的情况(因为超时后触发回滚不可能存在二阶段为CONFIRM)。

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

    探究Spring事务:了解失效场景及应对策略

    timeout:定义事务的超时时间,超过该时间未提交则自动回滚。 rollbackFor 和 noRollbackFor:指定在哪些异常情况下回滚事务或不回滚事务。...回滚策略: 默认情况下,Spring会将未捕获的运行时异常(RuntimeException及其子类)作为触发事务回滚的标志。你也可以通过rollbackFor属性指定哪些异常触发回滚。...异常被捕获但未重新抛出,事务将不会回滚。...method1(){ try { //一通处理猛如虎 }catch (Exception e){ //异常只吞不吐不回滚...method2(){ //一通处理猛如虎 } 事务方法内部调用 当事务方法内部通过普通的方法调用,而不是通过Spring管理的Bean调用其他带有@Transactional注解的方法时,

    25760

    java 如何知道回滚执行

    在 Java 应用开发中,尤其是涉及数据库事务处理时,回滚操作是确保数据一致性和完整性的关键机制。理解 Java 如何知道回滚执行对于开发可靠的应用程序至关重要。...Java 通过SQLException来知晓操作出现错误,进而触发回滚逻辑。 三、Spring 框架中的事务回滚 Spring 框架提供了更高级的事务管理抽象。...logic error"); } myRepository.insertData2(); } } 当doSomeTransactionalWork方法中抛出运行时异常时...在 Spring 框架中,则是依据方法抛出的异常(特别是运行时异常),结合@Transactional注解的配置,由框架自动处理回滚逻辑。...开发人员需要合理地设计异常处理策略,确保在关键业务操作中能够正确地触发回滚,以维护数据的一致性和应用程序的可靠性。

    8710

    spring boot唯一性判断不满足后,如何Transactional回滚

    在Spring Boot中,如果需要在唯一性判断不满足时进行事务回滚,可以通过以下方式实现: 首先,确保你的方法添加了@Transactional注解,这会使得该方法在一个数据库事务中执行,如果方法中出现任何异常...由于这个方法被@Transactional注解修饰,所以当这个异常被抛出时,Spring会自动回滚当前事务中的所有数据库操作。...注意:​​rollbackFor = Exception.class​​ 表示对所有的异常进行回滚,如果你只关心特定的异常,比如DuplicateKeyException,可以将其替换为具体的异常类型。...确保异常类型是可以触发回滚的,比如RuntimeException或是Error。 确保数据库支持事务,并且你的实体管理器配置正确。...如果你需要在不满足事务回滚条件时手动回滚,可以使用TransactionStatus对象。在事务方法中,你可以获取到这个对象,并调用它的setRollbackOnly()方法。

    19500

    Spring之事务传播行为

    由于外部方法并没有开启事务,所以内部方法均在自己的事务提交或者回滚,因此外部方法中存在异常,内部方法事务不会回滚。 被调用者均存在事务,而在被调用者中存在异常,那么结果如何?...,执行结果也不会触发回滚。...外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。...1.外部未开启事务时,内部方法则新建事务执行 private final static StudentDo studentDo = new StudentDo(); private final...2.外部方法开启事务: 如果外部方法发生异常,则内部事务一起发生回滚操作; 如果外部无异常情况,内部被调用方法存在异常情况,则内部方法独立回滚(疑问点???

    49630

    @Transactional千万不要这样用!!踩坑了你都可能发现不了!!!

    下图是调用@Transactional注解的方法时,Spring内部的时序图。...相关拓展 几种事务失效的场景 上面说到的两个问题,其实就是@Transactional注解使用不当,导致失效的两种情形;除此之外,以下几种情况也会导致事务失效: 业务代码中存在异常时,使用try…catch...RuntimeException,事务失效;Spring默认抛出未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。...如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。...数据被其他事务修改过,但还没有提交,就存在着回滚的可能性,这时候读取这些“未提交”数据的情况就是“脏读”。 在这个隔离级别会发生“脏读”场景。

    84520

    Spring事务失效的12种场景总结

    Spring中事务未生效的场景之事务未回滚 Spring的事务不回滚 1.错误的传播特性 说到事务的传播特性,首先应该知道事务的传播特性有哪些: 事务的传播行为类型 说明 PROPAGATION_REQUIRED...3.手动抛出了别的异常 即使开发者在编写过程中,没有手动抛出异常;但是如果出现的异常不正确,Spring事务也不会回滚。...4.自定义了回滚异常 在使用@Transactional注解声明事务时,有时我们想自定义回滚的异常,spring也是支持的。可以通过设置rollbackFor参数,来完成这个功能。...当我们直接使用@Transactional不指定rollbackFor时,Exception及其子类都不会触发回滚。 所以,建议一般情况下,将该参数设置成:Exception或Throwable。...如果出现了异常,只回滚doOtherThing方法里的内容,不回滚 userMapper.insertUser里的内容,即回滚保存点。

    5.6K10

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

    ❝Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务,已经执行的SQL会提交掉。...instanceof Error); } 所以,如果你想在出现了非RuntimeException或者Error时也回滚,请指定回滚时的异常,例如: @Transactional(rollbackFor...但是传播级别为nested时,实际上只存在一个事务,只是在调用a方法时设置了一个保存点,当a方法回滚时,实际上是回滚到保存点上,并且当外部事务提交时,内部事务才会提交,外部事务如果回滚,内部事务会跟着回滚...内部事务发生异常时,外部事务catch异常后,内外两个事务都回滚,但是方法不抛出异常 ❝ @Transactional public void testRollbackOnly() { try...显示回滚 最大的区别在于处理回滚时第二个参数传入的是false,这意味着回滚是回滚是预期之中的,所以在处理完回滚后并不会抛出异常。

    1K40

    【基础概念】YashanDB事务管理

    若操作过程中发生了故障,例如余额不足、账户冻结、营业厅断电等情况,事务将无法完整完成,则必须全部回滚。回滚后,所有的账户余额维持原状。...事务启动时,YashanDB会为其分配运行期间所需的资源,包括事务运行需要的内存、锁区、UNDO等,同时会为其分配一个全局唯一的事务ID。...退出连接时,根据该驱动或客户端工具的指令设置,事务会被自动提交或回滚。通常,正常退出时事务触发提交,异常退出时事务触发回滚。...自治事务自治事务时一种独立事务,可以在主事务中嵌套使用。YashanDB允许用户使用自治事务,可以在其中执行SQL操作,并独立结束自治事务。结束自治事务后,可以继续操作主事务。...自治事务具有以下特点: 自治事务对主事务中的未提交修改不可见,也不会与主事务共享锁或资源。 自治事务提交后,其他事务即可以对其修改可见,而不需要等待主事务提交。

    6410

    逸仙电商Seata企业级落地实践

    ,产生异常的应用独立回滚,非异常的应用数据已经持久化到数据库。...例:A=Insert,B=Update,如果回滚时不按照反向的顺序进行回滚,则有可能出现回滚时先把 A 删除了,再更新 A,引发错误。...同时全局事务超时(超时时间可自由配置)触发回滚。...由于这个全局事务已经回滚,需要防止网络恢复时,未持久化 Undo Log 的应用收到了分支注册成功的响应和持久化 Undo Log,并提交本地最终引发的数据不一致。...这个异常隐藏的比较深,而且在开发环境和测试环境无法复现,通过跟踪源码和总结原因发现,是由于开启了 Mysql 主从,导致提交/回滚时,Seata 通过 xid 查询分支事务时,数据未同步到从库,导致遗漏了一部分分支事务数据

    51320
    领券