W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本節(jié)主要介紹如何使用 Oracle XA 功能實(shí)現(xiàn)分布式事務(wù)的示例。
使用 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ù)器軟件包分別具有 OracleXADataSource
、OracleXAConnection
和 OracleXAResource
類的版本。 這三個(gè)類的抽象版本位于頂級(jí) oracle.jdbc.xa
包中。
如下為 XA 事務(wù)的處理過程示例:
使用 XA START
啟動(dòng) XA 事務(wù),并將其置于 ACTIVE
狀態(tài)。
對(duì)于處于 ACTIVE
狀態(tài)的 XA 事務(wù),執(zhí)行構(gòu)成該事務(wù)的 SQL 語句,然后執(zhí)行 XA END
語句。XA END
使事務(wù)置于 IDLE
狀態(tài)。
對(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
列出。
對(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;
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: