OceanBase 分布式事務(wù)示例

2021-06-30 16:20 更新

本節(jié)主要介紹如何使用 Oracle XA 功能實(shí)現(xiàn)分布式事務(wù)的示例。

Oracle XA 導(dǎo)入

使用 Oracle XA 功能必須導(dǎo)入以下內(nèi)容:

import oracle.jdbc.xa.OracleXid;
import oracle.jdbc.xa.OracleXAException;
import oracle.jdbc.pool.*;
import oracle.jdbc.xa.client.*;
import javax.transaction.xa.*;

oracle.jdbc.pool 軟件包具有用于連接池功能的類,并將與 XA 相關(guān)的類作為子類。

或者,如果代碼將在數(shù)據(jù)庫內(nèi)部運(yùn)行并訪問該數(shù)據(jù)庫以進(jìn)行 SQL 操作,則必須導(dǎo)入 oracle.jdbc.xa.server 而不是 oracle.jdbc.xa.client。語法如下:

import oracle.jdbc.xa.server.*;

客戶端和服務(wù)器軟件包分別具有 OracleXADataSourceOracleXAConnection 和 OracleXAResource 類的版本。 這三個(gè)類的抽象版本位于頂級(jí) oracle.jdbc.xa 包中。

Oracle XA 代碼示例

如下為 XA 事務(wù)的處理過程示例:

  1. 使用 XA START 啟動(dòng) XA 事務(wù),并將其置于 ACTIVE 狀態(tài)。

  2. 對(duì)于處于 ACTIVE 狀態(tài)的 XA 事務(wù),執(zhí)行構(gòu)成該事務(wù)的 SQL 語句,然后執(zhí)行 XA END 語句。XA END 使事務(wù)置于 IDLE 狀態(tài)。

  3. 對(duì)于處于 IDLE 狀態(tài)的 XA 事務(wù),可以執(zhí)行 XA PREPARE 語句或 XA COMMIT ... ONE PHASE 語句:

    •  XA PREPARE 將事務(wù)置于 PREPARED 狀態(tài)。此時(shí)的 XA RECOVER 語句在其輸出中包括事務(wù)的 xid 值,因?yàn)?nbsp;XA RECOVER 會(huì)列出所有處于 PREPARED 狀態(tài)的 XA 事務(wù)。

    • XA COMMIT ... ONE PHASE 用于預(yù)備和提交事務(wù)。由于事務(wù)終止,xid 值未由 XA RECOVER 列出。

  4. 對(duì)于處于 PREPARED 狀態(tài)的 XA 事務(wù),可以執(zhí)行 XA COMMIT 語句來提交和終止事務(wù),或者執(zhí)行 XA ROLLBACK 來回滾和終止事務(wù)。

public static void initClass() throws SQLException {
    createTable(tableName1, "c1 int,c2 int");
    createTable(tableName2, "c1 int,c2 int");
    createTable(tableName3, "c1 varchar(200)");
}

public void obOracleXAOne() throws Exception {
    Assume.assumeTrue(sharedUsePrepare());
    Connection conn = setConnection();
    conn.createStatement().execute(" insert into " + tableName1 + "  values(1,2)");
    JDBC4MysqlXAConnection mysqlXAConnection = new JDBC4MysqlXAConnection(
        (OceanBaseConnection) conn);
    String gtridStr = "gtrid_test_wgs_ob_oracle_xa_one";
    String bqualStr = "bqual_test_wgs_ob_oracle_xa_one";
    Xid xid = new MysqlXid(gtridStr.getBytes(), bqualStr.getBytes(), 123);
    try {
        mysqlXAConnection.start(xid, XAResource.TMNOFLAGS);
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        pstmt = conn.prepareStatement("select c1 from " + tableName1);
        rs = pstmt.executeQuery();

        while (rs.next()) {
            System.out.println(rs.getInt(1));
        }
        pstmt.close();
        pstmt = conn.prepareStatement("insert into " + tableName1 + " (c1, c2) values(?, ?)");
        pstmt.setInt(1, 12);
        pstmt.setInt(2, 12);
        pstmt.executeUpdate();
        mysqlXAConnection.end(xid, XAResource.TMSUCCESS);
        mysqlXAConnection.prepare(xid);
        mysqlXAConnection.commit(xid, false);
    } catch (Exception e) {
        e.printStackTrace();
        mysqlXAConnection.rollback(xid);
        throw e;
    }
}

public void obOracleXAOnePhase() throws Exception {
    Assume.assumeTrue(sharedUsePrepare());
    Connection conn = null;

    conn = setConnection();
    conn.createStatement().execute(" insert into " + tableName2 + "  values(1,2)");

    JDBC4MysqlXAConnection mysqlXAConnection = new JDBC4MysqlXAConnection(
        (OceanBaseConnection) conn);
    String gtridStr = "gtrid_test_wgs_ob_oracle_xa_one_phase";
    String bqualStr = "bqual_test_wgs_ob_oracle_xa_one_phase";

    Xid xid = new MysqlXid(gtridStr.getBytes(), bqualStr.getBytes(), 123);
    try {
        mysqlXAConnection.start(xid, XAResource.TMNOFLAGS);
        // ps test
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        pstmt = conn.prepareStatement("select c1 from " + tableName2 + "");
        rs = pstmt.executeQuery();

        while (rs.next()) {
            System.out.println(rs.getInt(1));
        }

        pstmt.close();

        pstmt = conn.prepareStatement("insert into " + tableName2 + " (c1, c2) values(?, ?)");
        pstmt.setInt(1, 12);
        pstmt.setInt(2, 12);
        pstmt.executeUpdate();

        mysqlXAConnection.end(xid, XAResource.TMSUCCESS);
        mysqlXAConnection.commit(xid, true);
    } catch (Exception e) {
        mysqlXAConnection.rollback(xid);
        throw e;
    }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)