在全球分散式交易中包含 Oracle Blockchain Platform

您的應用程式可能需要以原子方式更新 Oracle Blockchain Platform 分類帳和其他儲存區域,例如資料庫或其他區塊鏈分類帳,所有更新都成功或完全沒有。

若要跨多個資料庫啟用單元更新,開發人員可以使用由分散式交易協調器 (例如 Oracle WebLogic Server、Oracle Tuxedo、Oracle Transaction Manager for Microservices、JBoss Enterprise Application Platform、IBM WebSphere 及其他系統) 協調的全域交易。所有這些系統都仰賴 X/Open XA 協定,使用 XA 資源管理程式 (RM) 為每個資料庫或其他資源提供的標準 API 協調兩階段確認程序。Oracle Blockchain Platform 支援兩階段確認,並提供自己的 XA RM 程式庫,外部交易協調器可用來呼叫符合 XA 規範的 API。這些全球交易也可以使用上一個資源確認最佳化,包含單一非 XA 資源 (例如,非 Oracle 區塊鏈分類帳或不符合 XA 規範的資料庫)。

XA 規格是 X/Open Distributed Transaction Processing 架構的一部分,此架構定義了可讓多個應用程式共用多個資源管理程式所提供資源的標準架構。Java XA 介面本身是定義為 Java 平台的一部分。如需有關 Java XA 介面的詳細資訊,請參閱 Java 文件中的 Interface XAResource

Oracle Blockchain Platform 提供符合 XA 規格的程式庫,並導入 XA 資源管理程式的標準 Java 介面。磁帶櫃可讓用戶端交易管理程式協調全域交易。全域交易是單一工作單位,其中可能包括資料庫更新和區塊鏈交易等作業,這些作業全都必須原子確認。換句話說,所有作業都必須成功確認。如果屬於全域交易的任何作業失敗,則會倒回所有作業。XA 介面依賴兩階段確認協定,類似於原子交易 REST 端點支援的協定。如需有關 Oracle Blockchain Platform 中單元交易的詳細資訊,請參閱 Make Atomic Updates Across Chaincodes and Channels

Oracle Blockchain Platform 的 XA 實作是以 Java 程式庫形式提供,可從 Oracle Blockchain Platform 主控台之應用程式開發窗格的開發人員工具頁籤下載。

可下載檔案中提供的 Javadoc 資訊中包含程式庫的完整詳細資訊。程式庫支援的三個主要物件為 OBPXAResourceOBPXADataSourceOBPXAConnection
物件 目的
OBPXAResource 這個類別會實行所需的 API,讓交易管理程式與 Oracle Blockchain Platform 協調為 XA 交易的資源管理程式。
OBPXADataSource 您可以使用此物件取得 OBPXAConnection 的執行處理,並指定認證和授權證明資料。
OBPXAConnection 使用此物件取得 OBPXAResource 物件的執行處理,並定義要作為 XA 交易一部分執行的區塊鏈交易。

若要將 XA 程式庫與 Oracle Blockchain Platform 搭配使用,應用程式必須提供認證和授權所要求作業的證明資料。此程式庫同時支援基本認證 (使用者 / 密碼) 和 OAuth 2.0 存取記號,您可以在建立 OBPXADataSource 執行處理時進行設定。這兩種認證方法與您搭配 Oracle Blockchain Platform REST 代理主機使用的認證方法一致。如需詳細資訊,請參閱 REST API 文件中的認證

建立 OBPXADataSource 執行處理之後,您可以使用 obpxaDataSource.getXAConnection() 方法來取得 xaConnection 執行處理。若要在使用 OAuth 2.0 存取記號時更新認證,您可以使用 getXAConnection 方法,如下列程式碼所示:
OBPXAConnection xaConnection = obpxaDataSource.getXAConnection(accessToken);      // get an XA connection using an OAuth 2.0 access token
您也可以使用 getXAConnection 方法來更新基本認證。
OBPXAConnection xaConnection = obpxaDataSource.getXAConnection(user, password);   // get an XA connection using username and password for basic authentication
若要定義要作為全域 XA 交易一部分執行的區塊鏈交易,請使用下列方法:
public void createXAInvokeTransaction​(Xid xid, OBPXAInvokeTxRequest invokeTxRequest)
在此方法中,xid 是全域交易 ID,而 invokeTxRequest 是要在全域 XA 交易中執行的區塊鏈交易。如果要建立 XA 呼叫交易要求,請使用下列建構子方法:
OBPXAInvokeTxRequest invokeTxRequest = new OBPXAInvokeTxRequest(channel, chaincode, args);
在此建構子方法中,channel 是執行區塊鏈交易的通道,chaincode 是要使用的鏈碼,而 args 包含鏈碼函數和用於交易的任何引數。

下列程式碼片段示範建立 OBPXADataSource 物件、取得 OBPXAConnection 執行處理,然後建立交易要求並呼叫 createXAInvokeTransaction 方法。

OBPXADataSource obpxaDataSource = OBPXADataSource.builder()
                        .withHost(host)
                        .withPort(port)
                        .withBasicAuth(username, password)
                        .withRole(role)
                        .build();
.
.
.
OBPXAConnection obpxaConnection = obpxaDataSource.getXAConnection();

OBPXAInvokeTxRequest invokeTxRequest = new OBPXAInvokeTxRequest(channel, chaincode, args);
invokeTxRequest.setEndorsers(endorsersArray); // optional blockchain transaction request attributes
invokeTxRequest.setTransientMap(transientMap); // optional blockchain transaction request attributes
invokeTxRequest.setTimeout(60000); // optional blockchain transaction request attributes

obpxaConnection.createXAInvokeTransaction​(xid, invokeTxRequest);

案例:使用樣本瀏覽 XA 交易

下列案例類似於針對原子交易所描述的案例:案例:使用範例瀏覽原子交易,其使用 Oracle Blockchain Platform 所含的餘額移轉與泡泡樣本。

在此案例中,您將在 Oracle Blockchain Platform 的兩個不同例項上安裝餘額轉移和 Marbles 範例。然後,每個例項都會對應至 XA 資料來源:

  • XA 資源 OBP-1,在 goods 通道上安裝 Marbles 鏈碼
  • XA 資源 OBP-2,在公事包通道上安裝「餘額移轉」鏈碼

在此案例中,您可以使用跨多個資料來源的 XA 交易,確保資金交換和大理石傳輸以原子方式進行,其中所有作業都成功或完全不成功。下列程式碼說明此案例:

OBPXADataSource obpxaDS1 = ... // create an XA data source, supplying details about the OBP-1 instance
OBPXADataSource obpxaDS2 = ... // create an XA data source, supplying details about the OBP-2 instance

// start a global transaction in the client application
// invoke marble transfer on OBP-1
OBPXAConnection obpxaConn1 = (OBPXAConnection) obpxaDS1.getXAConnection();
OBPXAInvokeTxRequest invokeMarbleTransferReq = new OBPXAInvokeTxRequest("goods", "obcs-marbles", new String[]{"transferMarble", "marble1", "tom"});
obpxaConn1.createXAInvokeTransaction​(xid1, invokeMarbleTransferReq);
.
.
.
// invoke fund transfer on OBP-2
OBPXAConnection obpxaConn2 = (OBPXAConnection) obpxaDS2.getXAConnection();
OBPXAInvokeTxRequest invokeBalanceTransferReq = new OBPXAInvokeTxRequest("wallet", "obcs-example02", new String[]{"invoke", "a", "b", "50"});
obpxaConn2.createXAInvokeTransaction​(xid2, invokeBalanceTransferReq);
.
.
.
// end the global transaction in the client application

大理石擁有者欄位的預設值為已知問題。如需詳細資訊,請參閱:Oracle Blockchain Platform 的已知問題