一文读懂分布式事务的解决方案-环球快资讯

哔哩哔哩   2023-07-06 00:00:22

在 一文读懂分布式事务原理 中介绍了二阶段提交与三阶段提交,今天我们来聊聊市面上一些分布式的解决方案。


(资料图片)

1.基于MQ的方案

RocketMQ是支持事务消息的,可以直接使用。但是像RabbitMQ其他中间件不支持,可以采用以下的办法:消息发送方与接收方,各建一张消息处理表A与B

消息发送方事务

1.执行业务逻辑1

2.表A添加一条待处理状态消息。

消息接收方事务

1.表B添加一条消息记录

2.执行业务逻辑2

3.异步回调修改A表对应消息状态为已处理

定时任务

定时回查表A待处理的消息,去接收方查询表B查询对应关系的消息数据,会有如下两种情况

1.表B能查到消息,代表业务逻辑2执行成功,只需要修改表A的状态

2.表B查询不到数据,代表接收方可能处理失败了。重新发送消息走一遍逻辑。

框架

由事务的参与方(TxClient)与事务协调者(TxManager)两部分组成。如下图事务发起方、参与方A、参与方B都会向事务协调者申请各自的groupId,最后加入到同一个事务组进行管理。

lcn的使用

1.一个独立的工程启用TxManager

2.需要使用lcn的工程 方法上加 @LcnTransaction注解,配置文件指明TxManger的地址。

lcn缺点

可能造成死锁、性能较差

框架使用

由阿里巴巴开发,基于数据库的,分布式事务框架。

如何使用:

1.每个业务库新建UNDO_LOG 表

2.需要使用分布式事务的方法加上 @GlobalTransactional注解

3.在方法执行时,UNDO_LOG会生成每个本地事务的回滚语句,如果所有的事务都执行成功就会删除UNDO_LOG 表的数据。如果失败会使用回滚语句进行回滚。