关于分布式事务的一点学习总结
设计模型
采用类似TCC的事务模型,每个事务参与者都提供try, confirm, cancel的逻辑。在每个事务参与者的业务库的同一个实例都放一个事务所使用的库,简称事务库。
Try状态
尝试执行,比如对数据进行校验,检查事务是否可以进行等。并且在事务库里创建一条记录。此时记录中的状态字段记录为PENDING
Confirm状态
如果所有事务参与者的TRY都返回则表示可以进行,则提交事务。提交事务时在同一个本地事务里修改TRY阶段创建记录的状态为CONFIRM
Cancel状态
如果有任何一个事务参与者TRY阶段失败则发起CANCEL操作,并且在同一个本地事务里修改事务记录为CANCEL
事物冲突
在分布式环境中,可能对同一个数据进行并发操作,这样就会带来冲突。比如两个并发执行的事务可能对同一个订单进行修改,这可能造成冲突。这里的解决办法是我们给每种业务都分配一个business id,然后每个操作的资源都有一个resource id(比如这里就是订单号)。当一个事务要执行的时候我们可以判断对于同一个business id和resource id,是不是有未完成的事务(状态是PENDING),如果有则拒绝事务执行。
说明
- 每个事务开始时候会获取一个全局唯一的事务号(transaction id),该id会传递给所有的事务参与者并记录到事务参与者的事务记录中
- 事务协调器会根据事务记录中的状态对各事务参与者进行重试操作。比如主事务记录中状态是CONFIRM,则要重试到所有事务参与者的状态都到CONFIRM为止