跳到主要内容

分布式问题

分布式事务解决方案?

  1. 基于XA协议的:二阶段提交和三阶段提交
  2. 基于时间补偿机制:TCC 基于业务层面实现
  3. 本地消息表:基于数据库+mq,通过mq调用服务,完成响应后回调,将状态盖好才能完成。需要配合定时任务扫描,重发消息调用服务,需要保证幂等性;(不推荐使用)
  4. 基于事务消息:MQ

https://www.cnblogs.com/duanxz/p/4672708.html

https://www.freesion.com/article/29161397034/

针对 XA 相关文章阅读总结

二阶段提交

  1. 二阶段提交分别是 Prepare(尽可能的多干活,这样commit 的时候就更快)、Commit,或者 Prepare、Rollback
  2. 当资源不足,或者超时时容器出现经验异常(Heuristic Exception);
  3. 当使用数据XA驱动时(非必要不要使用),不要使用DDL(Data Define Language)语句操作、不要使用嵌套事务
  4. 二阶段提交存在同步阻塞、单点故障、数据不一致、二阶段状态不明问题
  5. XA mysql需要Innodb引擎是支持

三阶段提交

  1. 相比二阶段提交,引入了超时机制。保证最后提交阶段之前各参与者节点的状态是一致的
  2. 三阶段提交分别是:CanCommitPreCommitprepare执行Sql)、DoCommit

Q: 三阶段提交过程中,DoCommit 时,协调者收到一个失败,然后【参与者回滚失败】或者【参与者回滚成功响应协调者超时】,该如何?

思考:是再次发送回滚请求,还是直接终止事务;如果再次发送请求如果一直失败怎么办?如果直接终止事务,有参与者回滚失败会导致数据不一致的问题;

XAJTA区别

XA:处理分布式事务的规范

JTA:JAVA处理分布式事务的规范

MQ实现分布式事务?

https://www.cnblogs.com/wudimanong/p/10558710.html

img

实现分布式锁

利用唯一约束,插入表成功获取锁成功,插入表失败获取锁失败;如果操作执行完需要删除锁。

该锁不可重入,如果要实现可以维护当前获取锁线程的唯一标识,再重入时判断是否为当前获取锁的线程,是则默认获取锁成功。

协议
本作品代码部分采用 Apache 2.0协议 进行许可。遵循许可的前提下,你可以自由地对代码进行修改,再发布,可以将代码用作商业用途。但要求你:
  • 署名:在原有代码和衍生代码中,保留原作者署名及代码来源信息。
  • 保留许可证:在原有代码和衍生代码中,保留Apache 2.0协议文件。
本作品文档部分采用 知识共享署名 4.0 国际许可协议 进行许可。遵循许可的前提下,你可以自由地共享,包括在任何媒介上以任何形式复制、发行本作品,亦可以自由地演绎、修改、转换或以本作品为基础进行二次创作。但要求你:
  • 署名:应在使用本文档的全部或部分内容时候,注明原作者及来源信息。
  • 非商业性使用:不得用于商业出版或其他任何带有商业性质的行为。如需商业使用,请联系作者。
  • 相同方式共享的条件:在本文档基础上演绎、修改的作品,应当继续以知识共享署名 4.0国际许可协议进行许可。