分布式事务,算是分布式系统极为重要的一个模块。
分布式事务的概念,网上随手可见,我不多讲。
今天主要想聊聊,分布式事务的解决思路及其适用场景。
在说具体思路之前,我先假设一个业务调度功能,分别会调用A、B、C三个服务。
要保证这三个服务的事务,该怎么办呢?
可靠消息队列
A业务完成并提交数据库事务后,发送消息;B收到消息后,完成业务并提交数据库事务后,发送消息;
C收到消息后,完成业务并提交数据库事务。
整个过程,要保证尽一切可能完成,极端情况甚至需要人工介入。
优点:系统性能好(无需数据库锁)。
缺点:只能保证最终一致性,且可能需要人工介入。
适用场景:比如支付公司,交易和清分,便很适合通过可靠消息队列来实现,能极大提升交易接口性能。
XA:
通过数据库事务来实现。
优点:真正的数据库级别事务。
缺点:性能低。若A、B、C跨公司,则完全无法实现。
TCC:
Try、Commit、Cancel
先预留业务资源,成功则Commit,失败则Cancel。
优点:性能高。
缺点:实现复杂,容易出错。且有些业务,无法预留业务资源。
适用场景:通过账户交易下单类业务。比如将钱充值到加油App后,
通过App账户加油。(这个业务,必须先加油,再扣钱,所以必须锁住账户余额)
AT:
A、B、C分别执行并提交本地数据库事务,当失败时,执行补偿SQL。这个方案,需要借助框架,反向
SQL是框架自动生成且由框架自动执行。
优点:性能高,实现简单。
缺点:由于没有预留业务资源,可能导致资源无法回收。
适用场景:公司内部系统,跨公司系统无法使用。
SAGA:
业务编排 + 反向补偿,反向补偿又分为实时补偿和定时补偿。
优点:性能高,跨公司事务也能支持。
缺点:可能出现业务无法补偿的情况,所以对业务编排有要求。
适用场景:跨公司类的长事务业务。
标签:事务,场景,数据库,业务,补偿,聊聊,分布式 From: https://www.cnblogs.com/kingcode/p/18063605