ScalarDB Cluster .NET Client SDK での分散トランザクションをはじめよう
このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。
ScalarDB Cluster .NET Client SDK は、ScalarDB Cluster の分散トランザクション機能をサポートします。SDK には、クラスター内での通信を容易にするためのトランザクションとマネージャーの抽象化が含まれています。
次の例のように非同期メソッドを使用することをお勧めしますが、代わりに同期バージョンを使用することもできます。
分散 SQL トランザクションの詳細については、ScalarDB Cluster .NET Client SDK での分 散 SQL トランザクションをはじめようを参照してください。
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
}
}
設定ファイルやクライアントを設定するその他の方法の詳細については、クライアント設定を参照してください。
トランザクションマネージャーを取得する
分散トランザクションにはトランザクションマネージャーを取得する必要があります。トランザクションマネージャーを取得するには、次のように TransactionFactory
を使用します。
// Pass the path to the settings file created in the previous step.
var factory = TransactionFactory.Create("scalardb-options.json");
using var manager = factory.GetTransactionManager();
トランザクションを管理する
複数の CRUD 操作を単一のトランザクションの一部として実行するには、まずトランザクションを開始する必要があります。次のようにトランザクションマネージャーを使用してトランザクションを開始できます。
var transaction = await manager.BeginAsync();
次のようにして、すでに実行中のトランザクションを再開することもできます。
var transaction = manager.Resume(transactionIdString);
Resume
メソッドはトランザクションオブジェクトを作成するだけなので、非同期バージョンはありません。このため、間違った ID を使用してトランザクションを再開する可能性があります。
トランザクションをコミットする準備ができたら、次のようにトランザクションの CommitAsync
メソッドを呼び出すことができます。
await transaction.CommitAsync();
トランザクションをロールバックするには、RollbackAsync
メソッドを使用できます。
await transaction.RollbackAsync();
CRUD 操作を実行する
トランザクションには、クラスターに対して CRUD 操作を実行するための GetAsync
、ScanAsync
、InsertAsync
、UpsertAsync
、UpdateAsync
、DeleteAsync
、および MutateAsync
メソッドがあります。パラメーターとして、これらのメソッドには操作オブジェクトがあります。操作オブジェクトは、このセクションにリストされているビルダーを使用して作成できます。
CRUD 操作は、トランザクションを明示的に作成する必要なく、ワンショットトランザクション方式で実行できます。そのために、マネージャーオブジェクトには、トランザクションオブジェクトと同じ CRUD メソッドがあります。
ビルダーを使用するには、using
セクションに次の名前空間を追加します。
using ScalarDB.Client.Builders;
クラスターは1つのトランザクション内でのコマンドの並列実行をサポートしていないため、非同期メソッドには必ず await
を使用してください。
GetAsync
メソッドの例
単一のレコードを取得するには、次のように GetAsync
メソッドを使用します。
var get =
new GetBuilder()
.SetNamespaceName("ns")
.SetTableName("statements")
.AddPartitionKey("order_id", "1")
.AddClusteringKey("item_id", 2)
.SetProjections("item_id", "count")
.Build();
var getResult = await transaction.GetAsync(get);
パーティションキーの代わりにインデックスを使用してレコードを取得することも可能です。そのためには、次のように操作の種類を GetWithIndex
に設定する必要があります。
// ...
using ScalarDB.Client.Core;
// ...
var get =
new GetBuilder()
// ...
.SetGetType(GetOperationType.GetWithIndex)
.AddPartitionKey("index_column", "1")
.Build();
取得されたレコードが満たす必要のある任意の条件を指定することもできます。満たさない場合はレコードは返されません。条件は、次のように条件の結合として設定できます。
var get =
new GetBuilder()
// ...
.AddConjunction(c => c.AddCondition("cost", 1000, Operator.LessThan))
.AddConjunction(c =>
{
c.AddCondition("cost", 10000, Operator.LessThan);
c.AddCondition("in_stock", true, Operator.Equal);
})
.Build();
上記の例では、cost
が 1000
未満の場合、または cost
が 10000
未満で in_stock
が true の場合にのみ、レコードが返されます。