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

分布式事务最经典的7种解决方案都在这里了

其核心思想是将长事务拆分为多个本地短事务,由Saga事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。...容错机制: 扣减余额事务失败时,事务直接回滚,无后续步骤 轮询生产消息失败, 增加余额事务失败都会进行重试 本地消息表的特点: 长事务仅需要分拆成多个任务,使用简单 生产者需要额外的创建消息表 每个本地消息表都需要进行轮询...出现原因是当一个分支事务所在服务宕机或网络异常,分支事务调用记录为失败,这个时候其实是没有执行Try阶段,当故障恢复后,分布式事务进行回滚则会调用二阶段的Cancel方法,从而形成空回滚。...出现原因是在 RPC 调用分支事务try时,先注册分支事务,再执行RPC调用,如果此时 RPC 调用的网络发生拥堵,RPC 超时以后,TM就会通知RM回滚该分布式事务,可能回滚完成后,RPC 请求才到达参与者真正执行...插入成功,则调用屏障内逻辑 屏障内逻辑返回成功,提交事务,返回成功 屏障内逻辑返回错误,回滚事务,返回错误 在此机制下,解决了网络异常相关的问题 空补偿控制--如果Try没有执行,直接执行了Cancel

96730

Seata AT 模式分布式事务源码分析

如果一阶段成功那么二阶段仅仅异步删除刚刚插入的 UndoLog;如果二阶段失败则通过 UndoLog 生成反向 SQL 语句回滚一阶段的数据修改。...除了同步回滚这个点外,其他流程同提交时相似,如果同步回滚成功则释放全局锁并删除事务日志,如果失败则会进行异步重试。整个流程如下图所示: ?...二阶段生成反向 SQL 回滚 如果一阶段失败,则二阶段需要回滚一阶段的数据库更新操作,此时涉及到根据 UndoLog构造逆向 SQL 进行补偿。...UndoLogManager 负责 UndoLog 的插入、删除、补偿等操作,其中核心方法即为 undo,我们可以看到其中有一个无限 for 循环,一旦当前事务进行二阶段回滚时获取本地锁失败,则进入循环等待逻辑...,注册成功才能提交一阶段本地事务,如果注册失败报锁冲突则一直阻塞等待直到该全局锁被释放,且本地提交之后不论是否成功还需要再次向 TC 汇报一次分支状态。

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

    分布式事务最经典的七种解决方案

    其核心思想是将长事务拆分为多个本地短事务,由Saga事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。...容错机制: 扣减余额事务 失败时,事务直接回滚,无后续步骤 轮序生产消息失败, 增加余额事务失败都会进行重试 本地消息表的特点: 长事务仅需要分拆成多个任务,使用简单 生产者需要额外的创建消息表 每个本地消息表都需要进行轮询...出现原因是当一个分支事务所在服务宕机或网络异常,分支事务调用记录为失败,这个时候其实是没有执行Try阶段,当故障恢复后,分布式事务进行回滚则会调用二阶段的Cancel方法,从而形成空回滚。...出现原因是在 RPC 调用分支事务try时,先注册分支事务,再执行RPC调用,如果此时 RPC 调用的网络发生拥堵,RPC 超时以后,TM就会通知RM回滚该分布式事务,可能回滚完成后,RPC 请求才到达参与者真正执行...插入成功,则调用屏障内逻辑 屏障内逻辑返回成功,提交事务,返回成功 屏障内逻辑返回错误,回滚事务,返回错误 在此机制下,解决了网络异常相关的问题 空补偿控制--如果Try没有执行,直接执行了Cancel

    42520

    还不会分布式事务?教你7种解决方案,强烈建议收藏

    其核心思想是将长事务拆分为多个本地短事务,由Saga事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。...容错机制: 扣减余额事务 失败时,事务直接回滚,无后续步骤 轮序生产消息失败, 增加余额事务失败都会进行重试 本地消息表的特点: 长事务仅需要分拆成多个任务,使用简单 生产者需要额外的创建消息表 每个本地消息表都需要进行轮询...: 空回滚:   在没有调用 TCC 资源 Try 方法的情况下,调用了二阶段的 Cancel 方法,Cancel 方法需要识别出这是一个空回滚,然后直接返回成功。   ...出现原因是当一个分支事务所在服务宕机或网络异常,分支事务调用记录为失败,这个时候其实是没有执行Try阶段,当故障恢复后,分布式事务进行回滚则会调用二阶段的Cancel方法,从而形成空回滚。...插入成功,则调用屏障内逻辑 屏障内逻辑返回成功,提交事务,返回成功 屏障内逻辑返回错误,回滚事务,返回错误 在此机制下,解决了网络异常相关的问题 空补偿控制--如果Try没有执行,直接执行了Cancel

    66720

    分布式事务的七种解决方案

    其核心思想是将长事务拆分为多个本地短事务,由Saga事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。...容错机制: 扣减余额事务 失败时,事务直接回滚,无后续步骤 轮序生产消息失败, 增加余额事务失败都会进行重试 本地消息表的特点: 长事务仅需要分拆成多个任务,使用简单 生产者需要额外的创建消息表 每个本地消息表都需要进行轮询...出现原因是当一个分支事务所在服务宕机或网络异常,分支事务调用记录为失败,这个时候其实是没有执行Try阶段,当故障恢复后,分布式事务进行回滚则会调用二阶段的Cancel方法,从而形成空回滚。...出现原因是在 RPC 调用分支事务try时,先注册分支事务,再执行RPC调用,如果此时 RPC 调用的网络发生拥堵,RPC 超时以后,TM就会通知RM回滚该分布式事务,可能回滚完成后,Try 的 RPC...插入成功,则调用屏障内逻辑 屏障内逻辑返回成功,提交事务,返回成功 屏障内逻辑返回错误,回滚事务,返回错误 在此机制下,解决了网络异常相关的问题 空补偿控制--如果Try没有执行,直接执行了Cancel

    2.5K20

    Spring事务的传播属性和隔离级别

    如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。...支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。...而内层事务操作失败并不会引起外层事务的回滚。...使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。...Phantom Reads 幻像读 第一个数据正在查询符合某一条件的数据,这时,另一个事务又插入了一条符合条件的数据,第一个事务在第二次查询符合同一条件的数据时,发现多了一条前一次查询时没有的数据,

    50830

    使用触发器

    如果SQLCODE是负数(事件失败),系统间IRIS就不会执行AFTER触发器。 如果SQLCODE=100(没有发现要插入、更新或删除的行),则系统间IRIS执行AFTER触发器。...注意:使用事务的触发器的结果是,如果触发器调用提交事务的代码,则触发器的完成失败,因为事务级别已经递减为0.调用生产的业务服务时可能发生这种情况。...使用INSERT语句级别对象触发器后,如果触发器集%OK = 0,则使用SQLCODE -131错误失败行的插入失败。...如下所示,可能会发生交易回滚: 如果auto_commit = on,则插入的事务将被回滚。 如果auto_commit =off,则应用于回滚或提交输入的事务。...如果使用no_auto_commit模式,则不启动事务,因此插入件不能回滚。

    1.7K10

    阿里是如何处理分布式事务的

    如果RPC调用逻辑有问题,比如调用方机器宕机,网络异常,会造成RPC调用失败,也就是未能成功执行Try方法。但事务已经开启,需要推进到终态,因此TC会回调第二阶段cancel接口,从而形成空回滚。...先插入事务控制表,如果插入成功,说明二阶段还没有执行,可以继续执行第一阶段,如果插入失败,说二阶段已经执行或正在执行,抛出异常,终止。...confirm方法不允许空回滚,所以confirm方法一定要在try方法之后执行,所以confirm方法只需要关注重复提交的问题,可以先锁事务记录,如果事务记录为空,则说明是一个空提交,不允许,终止执行...cancel方法不允许空回滚,在先执行时,需要让try感知到,所以需要锁定事务记录,如果事务记录为空,则认为try方法还没有执行,为空回滚。...空回滚情况下先插入一条事务记录,确保后续try方法不会再执行。 如果插入成功,说明try还没有执行,空回滚继续执行。如果插入失败,认为try方法正在执行,等待tc重试即可。

    1.2K40

    还不会分布式事务?教你7种解决方案(强烈建议收藏)

    其核心思想是将长事务拆分为多个本地短事务,由Saga事务协调器协调,如果正常结束那就正常完成,如果某个步骤失败,则根据相反顺序一次调用补偿操作。...容错机制: 扣减余额事务 失败时,事务直接回滚,无后续步骤 轮序生产消息失败, 增加余额事务失败都会进行重试 本地消息表的特点: 长事务仅需要分拆成多个任务,使用简单 生产者需要额外的创建消息表 每个本地消息表都需要进行轮询...出现原因是当一个分支事务所在服务宕机或网络异常,分支事务调用记录为失败,这个时候其实是没有执行Try阶段,当故障恢复后,分布式事务进行回滚则会调用二阶段的Cancel方法,从而形成空回滚。...出现原因是在 RPC 调用分支事务try时,先注册分支事务,再执行RPC调用,如果此时 RPC 调用的网络发生拥堵,RPC 超时以后,TM就会通知RM回滚该分布式事务,可能回滚完成后,Try 的 RPC...插入成功,则调用屏障内逻辑 屏障内逻辑返回成功,提交事务,返回成功 屏障内逻辑返回错误,回滚事务,返回错误 在此机制下,解决了网络异常相关的问题 空补偿控制--如果Try没有执行,直接执行了Cancel

    54040

    一个99%的人都说不清楚知识点——Spring 事务传播行为

    我们都知道,一个事务要么成功,要么失败。但当若干个事务配合完成一个复杂任务时,就不能简单的这样一刀切了。我们需要根据任务之间的亲疏关系来指定哪些任务需要联动回滚,哪些任务即使失败也不会影响其他任务。...), /** * 必须使用事务,如果当前没有事务,则会抛出异常, * 如果存在当前事务,则沿用当前事务 */ MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY...,「小镜」的插入方法发生异常回滚自己的子事务;「小镜」的异常没有做处理,因此会被外部方法感知到,「小水」的插入方法在外部方法的子事务中,所以跟随主事务回滚transaction_nested_nestedException_try...(保存点),如果当前 NESTED 事务执行失败,则回滚到之前的保存点,保存点使得子事务的回滚不对主事务造成影响。...外部事务回滚时,子事务会跟着回滚;但子事务的回滚不会对外部事务和其他同级事务造成影响。 - 完 -

    53220

    【JavaP6大纲】MySQL篇:传播行为

    外围方法开启事务,内部方法加入外围方法事务,外围方法回滚,内部方法也要回滚,所以两个记录都插入失败。...propagation_supports(支持传播):支持当前事务,如果当前没有事务则以非事务方式执行 外围方法未开启事务,插入用户表和用户角色表的方法以非事务的方式独立运行,外围方法异常不影响内部插入...外围方法开启事务,内部方法加入外围方法事务,外围方法回滚,内部方法也要回滚,所以两个记录都插入失败。...propagation_mandatory(强制传播):使用当前事务,如果没有则抛出异常 外围方法开启事务,内部方法加入外围方法事务,外围方法回滚,内部方法也要回滚,所以两个记录都插入失败。...propagation_nested(嵌套传播):如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行

    26010

    tp框架事务处理实例和理解

    tp的事务开启是非常简单的, 只需要M()->startTrans();//开启事务,M()可以是M('xxx') $m->rollback();//事务回滚 $m->commit();//提交事务...;         //如果增加失败,则回滚         $order_model->rollback();         return $result;     }     //获取详细数据     ...$order_detail_model->add($k)) {             //如果插入订单详细信息错误,则回滚             $order_model->rollback();...开启事务就是开启监视器,然后 回滚的话,就中断了监视器,并且把监视到的内容返回去,比如下个订单, 下单成功,但是扣款失败,那么就会把下单成功的记录回滚回去,回到了没有下单时候的状态 提交事务,也就是关闭了监视器...当然,事务中断是不会终止程序运行的.它还会继续运行下去,所以得好好判断出错状态和回滚,提交位置

    77020

    过来人的经验,谈谈一致性处理方案—分布式事务(DTS)

    第二阶段:称为提交(commit)/回滚(rollback)阶段。是指事务真正提交或者回滚的阶段。如果事务协调者发现事务参与者有一个在prepare阶段出现失败,则会要求所有的参与者进行回滚。...如果单阶段参与者提交成功,那么协调者要求其余参与者都提交,如果提交失败则协调者要求其余参与者都事务回滚。这里的单阶段参与者也即为下文所述的事务发起方。...,如果参与者服务响应OK,则拦截器将自动将Action记录插入至本地的原子业务活动表(business_action)中。...上面只是对分布式事务正常的执行流程和原理进行了阐述,那如果在事务执行中,一阶段失败回滚的时候,恰好系统服务故障导致回滚不成功;或者二阶段提交时候,系统服务故障导致提交不成功,那么如何来保证一致性呢?...如果是DONE,表明一阶段完成,此时对应的是确认提交状态,应为C;如果为NOT_DONE,那么表明一阶段失败,对应了确认回滚状态,应为I。然后再调用对应的二阶段的提交/回滚就即可。

    1.8K40

    谈谈幂等技术(一)

    如果失败,则删除步骤一插入的记录 当同一个请求(moudle和code一样)多次过来后,会先执行步骤1插入幂等记录,介于唯一性约束,只有一个请求会插入成功,其他请求会抛出唯一键冲突异常。...这保证了步骤2只会执行一次。 上面方案看起来可行,但是考虑如果步骤一执行OK,在执行步骤2时候机器挂了,则会导致幂等记录不能被删除,这样会导致重复的请求过来后被幂等掉,从而导致请求被漏处理。...2.2 方案二 幂等处理流程: 开启事务 插入幂等记录:module=业务模块,code为业务幂等key 执行业务流程 提交/回滚事务 不同于方案一,方案二让插入幂等记录和业务处理放到了一个事务内。...这样当业务逻辑执行完成,则把幂等记录插入db,执行失败则回滚幂等记录。 那么一个问题是,开启事务本身是有开销的,是否可以在开启事务前先select一把,看看是否存在幂等记录,存在则直接返回那?...开启事务 插入幂等记录:module=业务模块,code为业务幂等key 执行业务流程 提交/回滚事务 这种方案是可行的,但是要看具体场景,如果需要被幂等掉的请求比较少,那么就没必要先select一把,

    51710

    Spring 事务传播行为使用与源码分析

    Spring 事务传播行为使用与源码分析我们知道在 Java 项目当中,在一次的接口调用时可能存在多个 DML 行为,而每一次的 DML 行为都可以单独的作为一次事务,所以有了事务的传播行为我们可以更加细粒度的控制这些方法对数据所造成的影响...,方法执行到 test4 时,插入一条数据后报错,并且这个是处于 test3 的调用链中的,所以把 test3 中插入的数据给回滚了。...并且因为事务的起点在 test3 ,test1 插入的数据没有在 test3 的事务范围内,所以 test1 插入的数据不会回滚。总结一下就是:当前传播行为从被标注的方法开始,到标注方法结束。...但是如果 test2 执行出现异常了,两个事务的数据都会回滚,test2 的数据回滚是好理解,但是为啥 test1 的事务也回滚了呢,因为 test2 在执行失败出现异常后catch (Throwable...首先 test1 执行后创建一个事务,执行到 test2 时它会以非事务运行,数据不会回滚自然后插入一条数据了。而因为 test2 出现异常后异常上抛,test1 执行存在事务,然后数据就回滚了。

    23410

    要不来重新认识Spring事务?三歪又学到了

    如果不大于0则表明奖品没有了,就返回奖品已经抽完的提示。 这种方案在奖品数量趋于0这个临界值时一定会出问题,因为大部分抽奖都是有一定并发性的。...当然,我不使用这种方法,我一般会在数据库里加上唯一索引,然后尽情的insert吧。 如果没有唯一键冲突,那就一定会插入成功,如果有唯一键冲突,那就一定会抛异常,Spring把这个异常进行了转化。...我以为的我以为 如果有较大量数据需要插入的话,我们都会使用批量插入,如果使用Mybatis的话就是标签了。...但是如果在对数据库执行sql操作时抛出了异常,则一定会选择回滚事务,毕竟这个事务是从数据库里引出来然后扩大到整个业务层,而不是倒过来。...如果是对数据库执行操作时抛出的,则总是会回滚事务,即使我们自己catch住或配置为不回滚,也照样没有用,最后都会回滚,毕竟数据库操作失败,不应该再有任何幻想。

    74120

    Kafka技术知识总结之二——Kafka事务

    提交或回滚事务 用户调用 producer.commitTransaction() 或 abortTransaction() 方法,提交或回滚事务; EndTxnRequest:生产者完成事务之后,客户端需要显式调用结束事务...所以我们需要解决的问题为:在上述任意步骤都有可能失败的情况下,还要保证订单库和购物车库这两个库的数据一致性。所以在这种跨库的事务操作中,需要使用到分布式事务。...依旧以上面的订单系统为例,有两个操作:在本地数据库中插入订单数据,以及向消息队列中发送订单信息,订单系统如何才能保证这两个操作同时成功,同时失败呢?...; 开启本地数据库事务,执行插入操作; 插入操作的结果,决定是否把消息提交; 如果本地数据库事务执行成功,则提交 (commit) 事务; 如果事务执行失败,则回滚 (abort) 事务; 如果发送提交.../ 回滚消息事务的请求出现异常(如超时等),不同的消息队列有不同的解决方式; Kafka:提交时错误会抛出异常,此时由业务自行决定如何处理。

    2K30
    领券