グローバル分散トランザクションに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を使用して、2フェーズ・コミット・プロセスを編成します。Oracle Blockchain Platformは、2フェーズ・コミットをサポートし、独自のXA RMライブラリを提供します。このライブラリは、外部トランザクション・コーディネータがXA準拠APIの呼出しに使用できます。これらのグローバル・トランザクションには、最後のリソース・コミット最適化を使用して、単一の非XAリソース(Oracle以外のブロックチェーン台帳や非XA準拠データベースなど)を含めることもできます。
XA仕様はX/Open Distributed Transaction Processingアーキテクチャの一部で、複数のアプリケーション・プログラムが複数のリソース・マネージャから提供されるリソースを共有できるようにするための標準アーキテクチャが定義されています。Java XAインタフェース自体は、Javaプラットフォームの一部として定義されます。Java XAインタフェースの詳細は、JavaドキュメントのインタフェースXAResourceを参照してください。
Oracle Blockchain Platformには、XA仕様に準拠し、XAリソース・マネージャ用の標準のJavaインタフェースを実装するライブラリが用意されています。ライブラリを使用すると、クライアント側のトランザクションマネージャーがグローバルトランザクションを調整できます。グローバル・トランザクションは、データベース更新やブロックチェーン・トランザクションなどの操作を含む単一の作業単位であり、これらはすべて原子的にコミットする必要があります。つまり、すべての操作がコミットされる必要があります。グローバル・トランザクションの一部である操作が失敗した場合は、すべての操作がロールバックされます。XAインタフェースは、アトミック・トランザクションのRESTエンドポイントでサポートされているプロトコルと同様に、2フェーズ・コミット・プロトコルに依存します。Oracle Blockchain Platformでの原子性トランザクションの詳細は、チェーンコードおよびチャネル全体での原子性更新を参照してください。
Oracle Blockchain PlatformのXA実装は、Javaライブラリとして提供されており、Oracle Blockchain Platformコンソールの「アプリケーション開発」ペインの「開発者ツール」タブからダウンロードできます。
OBPXAResource
、OBPXADataSource
およびOBPXAConnection
です。
オブジェクト | 目 的 |
---|---|
OBPXAResource |
このクラスは、トランザクション・マネージャがXAトランザクションのリソース・マネージャとしてOracle Blockchain Platformと連携するために必要なAPIを実装します。 |
OBPXADataSource |
このオブジェクトを使用して、OBPXAConnection のインスタンスを取得し、認証および認可資格証明を指定します。
|
OBPXAConnection |
このオブジェクトを使用して、OBPXAResource オブジェクトのインスタンスを取得し、XAトランザクションの一部として実行するブロックチェーン・トランザクションを定義します。
|
Oracle Blockchain PlatformでXAライブラリを使用するには、アプリケーションは、リクエストされた操作の認証および認可のための資格証明を提供する必要があります。ライブラリでは、OBPXADataSource
インスタンスの作成時に構成できる基本認証(ユーザー/パスワード)とOAuth 2.0アクセス・トークンの両方がサポートされています。2つの認証方法は、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
public void createXAInvokeTransaction(Xid xid, OBPXAInvokeTxRequest invokeTxRequest)
この方法では、xid
はグローバル・トランザクション識別子で、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の2つの異なるインスタンスに残高転送サンプルとMarblesサンプルをインストールします。各インスタンスは、XAデータ・ソースに対応します。
- goodsチャネルにMarblesチェーンコードがインストールされたXAリソースOBP-1
- ウォレット・チャネルに残高転送チェーンコードがインストールされている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