在 一文读懂分布式事务原理 中介绍了二阶段提交与三阶段提交,今天我们来聊聊市面上一些分布式的解决方案。
(资料图片)
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 表的数据。如果失败会使用回滚语句进行回滚。