经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
分布式事务解决方案汇总
来源:cnblogs  作者:威兰达  时间:2024/6/13 15:35:47  对本文有异议
2阶段(2PC)提交方案:
 
实现原理:基于XA规范搞的一套分布式事务的理论,也可以叫做一套规范,或者是协议。
 
(1)准备阶段(Prepare phase):事务管理器给每个参与者发送prepare消息,每个数据库参与者在本地执行事务,并写本地的Undo/Redo,此时事务没有提交。
 
(2)提交阶段(Commit phase):如果事务管理器接收了参与者执行失败或者超时消息时,直接给每个参与者发送回滚消息,
否则发送提交消息;参与者根据事务管理器的指令执行提交或者回滚操作,并释放事务处理过程中使用的锁资源。
 
代码实现参考:
  1. public static void main(String[] args) throws SQLException {
  2. //true表示打印XA语句,,用于调试
  3. boolean logXaCommands = true;
  4. // 获得资源管理器操作接口实例 RM1
  5. Connection conn1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user", "root", "root");
  6. XAConnection xaConn1 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn1, logXaCommands);
  7. XAResource rm1 = xaConn1.getXAResource();
  8. // 获得资源管理器操作接口实例 RM2
  9. Connection conn2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_account", "root", "root");
  10. XAConnection xaConn2 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn2, logXaCommands);
  11. XAResource rm2 = xaConn2.getXAResource();
  12. // AP请求TM执行一个分布式事务,TM生成全局事务id
  13. byte[] gtrid = "g12345".getBytes();
  14. int formatId = 1;
  15. try {
  16. // TM生成rm1上的事务分支id
  17. byte[] bqual1 = "b00001".getBytes();
  18. Xid xid1 = new MysqlXid(gtrid, bqual1, formatId);
  19. // 执行rm1上的事务分支
  20. rm1.start(xid1, XAResource.TMNOFLAGS);
  21. PreparedStatement ps1 = conn1.prepareStatement("INSERT into user(name) VALUES ('test')");
  22. ps1.execute();
  23. rm1.end(xid1, XAResource.TMSUCCESS);
  24. // TM生成rm2上的事务分支id
  25. byte[] bqual2 = "b00002".getBytes();
  26. Xid xid2 = new MysqlXid(gtrid, bqual2, formatId);
  27. // 执行rm2上的事务分支
  28. rm2.start(xid2, XAResource.TMNOFLAGS);
  29. PreparedStatement ps2 = conn2.prepareStatement("INSERT into account(user_id,money) VALUES (1,10000000)");
  30. ps2.execute();
  31. rm2.end(xid2, XAResource.TMSUCCESS);
  32. // 两阶段提交
  33. // phase1:询问所有的RM 准备提交事务分支
  34. int rm1_prepare = rm1.prepare(xid1);
  35. int rm2_prepare = rm2.prepare(xid2);
  36. // phase2:提交所有事务分支
  37. boolean onePhase = false;
  38. //TM判断有2个事务分支,所以不能优化为一阶段提交
  39. if (rm1_prepare == XAResource.XA_OK && rm2_prepare == XAResource.XA_OK) {
  40. rm1.commit(xid1, onePhase);
  41. rm2.commit(xid2, onePhase);
  42. } else {
  43. //如果有事务分支没有成功,则回滚
  44. rm1.rollback(xid1);
  45. rm2.rollback(xid2);
  46. }
  47. } catch (XAException e) {
  48. e.printStackTrace();
  49. }
  50. }
1.最好pom引入开源的分布式事务管理器,如Atomikos作为本地事务管理器。如:Spring Boot集成atomikos快速入门Demo
 
2.在分布式环境中,每个服务配置 Atomikos 作为本地事务管理器,但是全局事务的管理和协调是由一个独立的分布式事务协调器(DTC)来完成。
 
3.在分布式环境中,独立的分布式事务协调器(DTC)通常是一个单独的服务或组件。通常情况下,
  项目除了引入 Atomikos 作为本地事务管理器之外,还需要考虑如何部署和配置这个分布式事务协调器。
  
4.在分布式环境中,确保分布式事务的一致性和可靠性需要配合使用本地事务管理器(如 Atomikos)和一个独立的分布式事务协调器(DTC)。
 
 

原文链接:https://www.cnblogs.com/lgg20/p/18245990

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号