分布式事务解决方案汇总

· 浏览次数 : 0

小编点评

2阶段(2PC)提交方案是一种基于XA规范的分布式事务实现原理。该方案分为两个阶段:准备阶段(Prepare phase)和提交阶段(Commit phase)。 1. 准备阶段(Prepare phase): 事务管理器向每个参与者发送prepare消息,每个数据库参与者在本地执行事务,并写入本地Undo/Redo。此时,事务尚未提交。 2. 提交阶段(Commit phase): 如果事务管理器收到参与者执行失败或超时消息,它会向每个参与者发送回滚消息;否则,发送提交消息。参与者根据事务管理器的指令执行提交或回滚操作,并释放事务处理过程中使用的锁资源。 代码实现参考: ```java public static void main(String[] args) throws SQLException { // 设置日志记录XA语句,便于调试 boolean logXaCommands = true; // 获取资源管理器操作接口实例 RM1 Connection conn1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user", "root", "root"); XAConnection xaConn1 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn1, logXaCommands); XAResource rm1 = xaConn1.getXAResource(); // 获取资源管理器操作接口实例 RM2 Connection conn2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_account", "root", "root"); XAConnection xaConn2 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn2, logXaCommands); XAResource rm2 = xaConn2.getXAResource(); // 申请TM执行分布式事务,TM生成全局事务ID byte[] gtrid = "g12345".getBytes(); int formatId = 1; try { // TM生成rm1上的事务分支ID byte[] bqual1 = "b00001".getBytes(); Xid xid1 = new MysqlXid(gtrid, bqual1, formatId); // 执行rm1上的事务分支 rm1.start(xid1, XAResource.TMNOFLAGS); PreparedStatement ps1 = conn1.prepareStatement("INSERT into user(name) VALUES ('test')"); ps1.execute(); rm1.end(xid1, XAResource.TMSUCCESS); // TM生成rm2上的事务分支ID byte[] bqual2 = "b00002".getBytes(); Xid xid2 = new MysqlXid(gtrid, bqual2, formatId); // 执行rm2上的事务分支 rm2.start(xid2, XAResource.TMNOFLAGS); PreparedStatement ps2 = conn2.prepareStatement("INSERT into account(user_id,money) VALUES (1,10000000)"); ps2.execute(); rm2.end(xid2, XAResource.TMSUCCESS); // 二阶段提交 // phase1:询问所有的RM准备提交事务分支 int rm1_prepare = rm1.prepare(xid1); int rm2_prepare = rm2.prepare(xid2); // phase2:提交所有事务分支 boolean onePhase = false; // 如果有事务分支没有成功,则回滚 if (rm1_prepare == XAResource.XA_OK && rm2_prepare == XAResource.XA_OK) { rm1.commit(xid1, onePhase); rm2.commit(xid2, onePhase); } else { rm1.rollback(xid1); rm2.rollback(xid2); } } catch (XAException e) { e.printStackTrace(); } } ``` 在实际应用中,可以使用开源的分布式事务管理器,如Atomikos作为本地事务管理器。在分布式环境中,每个服务配置Atomikos作为本地事务管理器,而全局事务的管理和协调则由一个独立的分布式事务协调器(DTC)完成。确保分布式事务一致性和可靠性的关键在于结合使用本地事务管理器(如Atomikos)和独立的分布式事务协调器(DTC)。

正文

2阶段(2PC)提交方案:
 
实现原理:基于XA规范搞的一套分布式事务的理论,也可以叫做一套规范,或者是协议。
 
(1)准备阶段(Prepare phase):事务管理器给每个参与者发送prepare消息,每个数据库参与者在本地执行事务,并写本地的Undo/Redo,此时事务没有提交。
 
(2)提交阶段(Commit phase):如果事务管理器接收了参与者执行失败或者超时消息时,直接给每个参与者发送回滚消息,
否则发送提交消息;参与者根据事务管理器的指令执行提交或者回滚操作,并释放事务处理过程中使用的锁资源。
 
代码实现参考:
public static void main(String[] args) throws SQLException {
        //true表示打印XA语句,,用于调试
        boolean logXaCommands = true;
        // 获得资源管理器操作接口实例 RM1
        Connection conn1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user", "root", "root");
        XAConnection xaConn1 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn1, logXaCommands);
        XAResource rm1 = xaConn1.getXAResource();
        // 获得资源管理器操作接口实例 RM2
        Connection conn2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_account", "root", "root");
        XAConnection xaConn2 = new MysqlXAConnection((com.mysql.jdbc.Connection) conn2, logXaCommands);
        XAResource rm2 = xaConn2.getXAResource();
        // AP请求TM执行一个分布式事务,TM生成全局事务id
        byte[] gtrid = "g12345".getBytes();
        int formatId = 1;
        try {
            // TM生成rm1上的事务分支id
            byte[] bqual1 = "b00001".getBytes();
            Xid xid1 = new MysqlXid(gtrid, bqual1, formatId);
            // 执行rm1上的事务分支
            rm1.start(xid1, XAResource.TMNOFLAGS);
            PreparedStatement ps1 = conn1.prepareStatement("INSERT into user(name) VALUES ('test')");
            ps1.execute();
            rm1.end(xid1, XAResource.TMSUCCESS);

            // TM生成rm2上的事务分支id
            byte[] bqual2 = "b00002".getBytes();
            Xid xid2 = new MysqlXid(gtrid, bqual2, formatId);
            // 执行rm2上的事务分支
            rm2.start(xid2, XAResource.TMNOFLAGS);
            PreparedStatement ps2 = conn2.prepareStatement("INSERT into account(user_id,money) VALUES (1,10000000)");
            ps2.execute();
            rm2.end(xid2, XAResource.TMSUCCESS);

            // 两阶段提交
            // phase1:询问所有的RM 准备提交事务分支
            int rm1_prepare = rm1.prepare(xid1);
            int rm2_prepare = rm2.prepare(xid2);

            // phase2:提交所有事务分支
            boolean onePhase = false;
            //TM判断有2个事务分支,所以不能优化为一阶段提交
            if (rm1_prepare == XAResource.XA_OK && rm2_prepare == XAResource.XA_OK) {
                rm1.commit(xid1, onePhase);
                rm2.commit(xid2, onePhase);
            } else {
                //如果有事务分支没有成功,则回滚
                rm1.rollback(xid1);
                rm2.rollback(xid2);
            }
        } catch (XAException e) {
            e.printStackTrace();
        }
    }
1.最好pom引入开源的分布式事务管理器,如Atomikos作为本地事务管理器。如:Spring Boot集成atomikos快速入门Demo
 
2.在分布式环境中,每个服务配置 Atomikos 作为本地事务管理器,但是全局事务的管理和协调是由一个独立的分布式事务协调器(DTC)来完成。
 
3.在分布式环境中,独立的分布式事务协调器(DTC)通常是一个单独的服务或组件。通常情况下,
  项目除了引入 Atomikos 作为本地事务管理器之外,还需要考虑如何部署和配置这个分布式事务协调器。
  
4.在分布式环境中,确保分布式事务的一致性和可靠性需要配合使用本地事务管理器(如 Atomikos)和一个独立的分布式事务协调器(DTC)。
 
 

与分布式事务解决方案汇总相似的内容:

分布式事务解决方案汇总

2阶段(2PC)提交方案: 实现原理:基于XA规范搞的一套分布式事务的理论,也可以叫做一套规范,或者是协议。 (1)准备阶段(Prepare phase):事务管理器给每个参与者发送prepare消息,每个数据库参与者在本地执行事务,并写本地的Undo/Redo,此时事务没有提交。 (2)提交阶段(

聊聊Seata分布式解决方案AT模式的实现原理

### 什么是Seata分布式事务解决方案 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 ### AT模式 AT模式目前来看是Seata框架独有的一种模式,其它的分布式框架上

Seata原理浅析

前言 Seata是阿里开源的分布式事务解决方案,本文将详细介绍 Seata 的事务模式、原理以及使用。了解之前需清楚什么是分布式事务。 一、什么是 Seata Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了XA、AT、TCC 和 S

一种基于柔性事务的分布式事务解决方案设计探究

1 背景 市面上常见的有,2pc/3pc、tcc、saga等常见的分布式事务解决方案,但是实际实施起来框架比较重,设计开发比较繁琐,不易于快速开发上手。本文提供一种基于柔性事务设计的简单易上手的分布式事务设计方案,用于解决常见的分布式事务常见场景。 2 常见分布式事务场景 2.1 同步场景 常见的场

架构与思维:4大主流分布式算法介绍(图文并茂、算法拆解)

0 导读 之前的文章中,我们介绍过分布式事务的基础知识,也了解了分布式场景下常见一致性问题和解决方案,对分布式锁和CAS模式有一定的了解,有兴趣的同学可以通过下面链接到作者的两篇相关文章。 五种分布式事务解决方案(图文总结) 高并发下的数据一致性保障(图文全面总结) 1 介绍 本文聚焦高并发场景下分

[转帖]Percolator 和 TiDB 事务算法

https://cn.pingcap.com/blog/percolator-and-txn 本文先概括的讲一下 Google Percolator 的大致流程。Percolator 是 Google 的上一代分布式事务解决方案,构建在 BigTable 之上,在 Google 内部 用于网页索引更

❤️‍ Solon Cloud Event 新的事务特性与应用

1、Solon Cloud Event? 是 Solon 分布式事件总线的解决方案。也是 Solon “最终一致性”分布式事务的解决方案之一 2、事务特性 事务?就是要求 Event 有原子性,当多个 Event 发布时,要么全成功,要么全失败。 public class EventDemo { p

基于Seata探寻分布式事务的实现方案

随着业务的快速发展、业务复杂度越来越高,几乎每个公司的系统都会从单体走向分布式,特别是转向微服务架构。随之而来就必然遇到分布式事务这个难题,这篇文章通过seata框架总结了分布式事务的几种解决方案。

谈谈分布式事务原理

分布式系统中,不同服务之间的交互可能会出现各种问题,如网络、异常等,可能会导致服务间的数据产生不一致的情况,如何避免?本文将详细讲述分布式事务的原理和解决方案。

聊聊分布式解决方案Saga模式

### Saga模式 Saga模式使用一系列本地事务来提供事务管理,而一个本地事务对应一个Saga参与者,在Saga流程里面每一个本地事务只操作本地数据库,然后通过消息或事件来触发下一个本地事务,如果其中一个本地事务失败了,Saga就会执行一系列补偿事务来实现回滚操作。(补偿事务简单来讲就是对之前本