Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

DynamoDB で AWS SDK for .NET オブジェクト永続性モデルを使用した、バージョン番号によるオプティミスティックロック

オブジェクト永続性モデルではオプティミスティックロックがサポートされており、項目を更新または削除する前に、アプリケーションの項目バージョンとサーバー側の項目バージョンが同じになります。更新する項目を取り出すとします。しかし、更新を返送する前に、他のアプリケーションが同じ項目を更新しました。この場合、アプリケーションに項目の古いコピーが残ることになります。オプティミスティックロックがない場合に更新を行うと、他のアプリケーションで行われた更新が上書きされます。

オブジェクト永続性モデルのオプティミスティックロック機能では、オプティミスティックロックを有効にするために DynamoDBVersion タグを使用できます。この機能を使用するには、バージョン番号を格納するためのプロパティをクラスに追加します。DynamoDBVersion 属性をプロパティに追加します。最初にオブジェクトを保存すると、DynamoDBContext によってバージョン番号が割り当てられ、項目を更新するたびにその値が増えていきます。

更新または削除リクエストは、クライアント側のオブジェクトのバージョンが、サーバー側の対応する項目のバージョン番号に一致する場合のみ成功します。アプリケーションに古いコピーがある場合に項目を更新または削除するには、その前にサーバーから最新バージョンを取得する必要があります。

次の C# コードスニペットでは、オブジェクト永続性属性と合わせて Book クラスを定義し、ProductCatalog テーブルにマッピングしています。VersionNumber 属性が指定されたクラスの DynamoDBVersion プロパティには、バージョン番号が格納されます。

[DynamoDBTable("ProductCatalog")] public class Book { [DynamoDBHashKey] //Partition key public int Id { get; set; } [DynamoDBProperty] public string Title { get; set; } [DynamoDBProperty] public string ISBN { get; set; } [DynamoDBProperty("Authors")] public List<string> BookAuthors { get; set; } [DynamoDBVersion] public int? VersionNumber { get; set; } }

注記

DynamoDBVersion 属性は、null が許容された数値プリミティブ型(int? など)に対してのみ適用できます。

オプティミスティックロックは、DynamoDBContext オペレーションに対して次のような影響があります。

  • DynamoDBContext は、新しい項目に対して初期バージョン番号 0 を割り当てます。既存の項目を取り出し、その項目の 1 つ以上のプロパティを更新して変更を保存する場合には、クライアント側とサーバー側のバージョン番号が一致する場合のみ、保存が成功します。DynamoDBContext によってバージョン番号が増加します。バージョン番号を設定する必要はありません。

  • 次の C# コードスニペットに示すように、Delete メソッドでは、プライマリキーの値またはオブジェクトのいずれかをパラメータとして指定できるオーバーロードを使用できます。

    DynamoDBContext context = new DynamoDBContext(client); ... // Load a book. Book book = context.Load<ProductCatalog>(111); // Do other operations. // Delete 1 - Pass in the book object. context.Delete<ProductCatalog>(book); // Delete 2 - pass in the Id (primary key) context.Delete<ProductCatalog>(222);

    パラメータとしてオブジェクトを指定した場合には、オブジェクトのバージョンがサーバー側の対応する項目のバージョンと一致する場合のみ、削除が可能になります。ただしパラメータとしてプライマリキーの値を入力した場合には、DynamoDBContext はバージョン番号を認識せず、バージョンチェックを行わずに項目を削除します。

    オブジェクト永続性モデルのコードでは、オプティミスティックロックの内部実装で、DynamoDB の条件付き更新と条件付き削除 API アクションが使用されます。

オプティミスティックロックの無効化

オプティミスティックロックを無効にするには、SkipVersionCheck 設定プロパティを使用します。このプロパティは、DynamoDBContext の作成時に設定できます。この場合、このコンテキストを使用して作成したすべてのリクエストについて、オプティミスティックロックが無効になります。詳細については、「DynamoDBContext でのオプションパラメータの指定 」を参照してください。

コンテキストレベルでプロパティを設定する代わりに、次の C# コードスニペットに示すように、特定のオペレーションに対するオプティミスティックロックを無効にすることができます。コード例では、このコンテキストを使用して書籍項目を削除しています。Delete メソッドはオプションの SkipVersionCheck プロパティを true に設定し、バージョンチェックを無効にします。

DynamoDBContext context = new DynamoDBContext(client); // Load a book. Book book = context.Load<ProductCatalog>(111); ... // Delete the book. context.Delete<Book>(book, new DynamoDBContextConfig { SkipVersionCheck = true });