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

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

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

80830

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

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

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

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

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

37320

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

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

62620

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

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

2.3K20

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

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

49130

使用触发器

如果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

46540

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

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

24010

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

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

37120

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

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

72620

谈谈幂等技术(一)

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

47810

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

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

1.7K40

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

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

17410

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

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

70320
领券