メインコンテンツまでスキップ
バージョン: 3.14

ScalarDB Cluster .NET Client SDK の 2 フェーズコミットインターフェイスを使用した分散トランザクションをはじめよう

注記

このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。

ScalarDB Cluster .NET Client SDK は、ScalarDB の 2 フェーズコミットインターフェイスを使用したトランザクションをサポートします。SDK には、クラスター内の通信を強化するためのトランザクションとマネージャーの抽象化が含まれています。

注記

次の例のように非同期メソッドを使用することをお勧めしますが、代わりに同期メソッドを使用することもできます。

2 フェーズコミットインターフェースを使用したトランザクションについて

SDK を使用すると、複数のアプリケーションにまたがる 2 フェーズコミットインターフェースを使用したトランザクションを実行できます。たとえば、複数のマイクロサービスがある場合、それぞれのマイクロサービスにトランザクションマネージャーを作成し、それらのマイクロサービスにまたがるトランザクションを実行できます。

2 フェーズコミットインターフェースを使用したトランザクションには、コーディネーターと参加者の 2 つのロールがあり、これらが協力して 1 つのトランザクションを実行します。

コーディネータープロセスは最初にトランザクションを開始し、トランザクションの ID をすべての参加者に送信し、参加者プロセスがトランザクションに参加します。 CRUD または SQL 操作を実行した後、コーディネータープロセスと参加者プロセスは 2 フェーズインターフェースを使用してトランザクションをコミットします。

SDK をインストールする

ScalarDB Cluster と同じメジャーバージョンとマイナーバージョンの SDK を .NET プロジェクトにインストールします。組み込みの NuGet パッケージマネージャーを使用してこれを行うことができます。<MAJOR>.<MINOR> を、使用しているバージョンに置き換えます。

dotnet add package ScalarDB.Client --version '<MAJOR>.<MINOR>.*'

設定ファイルを作成する

scalardb-options.json ファイルを作成し、次の内容を追加します。<HOSTNAME_OR_IP_ADDRESS> を FQDN または IP アドレスに、<PORT> をクラスターのポート番号 (デフォルトでは 60053) に置き換えます。

{
"ScalarDbOptions": {
"Address": "http://<HOSTNAME_OR_IP_ADDRESS>:<PORT>",
"HopLimit": 10
}
}

設定ファイルやクライアントを設定するその他の方法の詳細については、クライアント設定を参照してください。

トランザクションマネージャーを取得します (コーディネータと参加者用)

2 フェーズコミットインターフェイスを使用した分散トランザクションには、トランザクションマネージャーを取得する必要があります。トランザクションマネージャーを取得するには、次のように TransactionFactory を使用します。

// Pass the path to the settings file created in the previous step.
var factory = TransactionFactory.Create("scalardb-options.json");

using var manager = factory.GetTwoPhaseCommitTransactionManager();

あるいは、次のトランザクションマネージャーを指定して、2 フェーズコミットインターフェイスを使用したトランザクションに CRUD 操作の代わりに SQL を使用することもできます。

using var manager = factory.GetSqlTwoPhaseCommitTransactionManager();

トランザクションを開始する (コーディネータ用)

次のように、コーディネータの 2 フェーズコミットインターフェイスを使用してトランザクションを開始できます。

var transaction = await manager.BeginAsync();

開始されたトランザクションの ID は、次のコードで取得できます。

var transactionId = transaction.Id;

トランザクションに参加する (参加者向け)

参加者の 2 フェーズコミットインターフェイスを使用して、次のようにトランザクションに参加できます。

var transaction = await manager.JoinAsync(transactionId);

トランザクションを再開する (コーディネータと参加者用)

通常、2 フェーズコミットインターフェイスを使用したトランザクションには、複数の要求と応答の交換が含まれます。以前の要求で開始または参加したトランザクションを操作する必要がある場合は、次のようにしてそのトランザクションを再開できます。

var transaction = manager.Resume(transactionId);
注記

Resume メソッドはトランザクションオブジェクトを作成するだけなので、非同期バージョンはありません。このため、間違った ID を使用してトランザクションを再開する可能性があります。

トランザクションをロールバックする

トランザクションがコミットに失敗した場合は、次のようにトランザクションをロールバックできます。

await transaction.RollbackAsync();

トランザクションをコミットする (コーディネータと参加者用)

CRUD または SQL 操作を完了したら、トランザクションをコミットする必要があります。ただし、2 フェーズコミットインターフェイスを使用したトランザクションの場合は、まずコーディネータとすべての参加者でトランザクションを準備する必要があります。

await transaction.PrepareAsync();

次に、同時実行制御プロトコルに応じて、次のようにコーディネーターとすべての参加者でトランザクションを検証する必要がある場合があります。

await transaction.ValidateAsync();

最後に、次のようにしてコーディネーターとすべての参加者にトランザクションをコミットできます。

await transaction.CommitAsync();

コーディネータまたは参加者のいずれかがトランザクションの準備または検証に失敗した場合は、コーディネータとすべての参加者で RollbackAsync を呼び出す必要があります。

また、コーディネータとすべての参加者がトランザクションのコミットに失敗した場合は、コーディネータとすべての参加者で RollbackAsync を呼び出す必要があります。

ただし、コーディネータまたは一部の参加者のみがトランザクションのコミットに失敗した場合は、コーディネータまたはいずれかの参加者がトランザクションのコミットに成功している限り、トランザクションはコミットされたとみなされます。

CRUD 操作を実行する

トランザクションの 2 フェーズコミットインターフェイスには、通常のトランザクションと同じ CRUD 操作メソッドがあります。詳細については、CRUD 操作を実行する を参照してください。

SQL ステートメントを実行する

SQL トランザクションの 2 フェーズコミットインターフェイスには、通常の SQL トランザクションと同じ SQL クエリを実行するメソッドがあります。詳細については、SQL クエリを実行するを参照してください.