web-dev-qa-db-ja.com

DynamoDBにはデフォルトでロックがありますか?

私はダイナモのドキュメントを調べていますが、楽観的な見方をしています。これがデフォルトで使用されるかどうか疑問に思っています。

ドキュメントから、Javaアプリケーションをコード化して@DynamoDBVersionAttributeアノテーションを使用し、バージョンを取得して設定する必要があります。これを行わないと、次のように書くことができますなんらかのロックなしでDynamoDBに。

あれは正しいですか?

余談ですが、私は何らかのロックのないDBにあまり慣れていないので、DynamoDBで2人が同じアイテムに同時にロックなしで書き込んだ場合はどうなりますか?書き込み先のアイテムに4つのフィールドがあるとします。1つの書き込みが完全に失敗するのでしょうか、それともDynamoDBが1つの書き込みで2/4フィールドを更新し、他の2つのフィールドを他の書き込みで更新することは可能ですか?

9
Kevin

あなたは正しいです。 DynamoDBには、デフォルトでは楽観的ロックはありません。 DynamoDBにはさまざまなSDKがあり、私が知っている限り 楽観的ロック機能はJava SDK です)。

Java SDKの楽観的ロックが実際にサポートしているものは次のとおりです。

  • テーブルにversionという属性を作成します
  • 更新する前に、データベースからアイテムをロードする必要があります
  • アイテムを保存しようとすると、SDKはクライアントアイテムのバージョン番号が表の番号と一致することをテストし、一致する場合は保存が完了してバージョン番号が増分されます。

別のSDKを使用している場合は、これを実装するのは非常に簡単です。自分でバージョン属性を作成します。 putItem メソッド(およびその他の必要な保存/更新操作)のラッパーを作成します。 条件式 を使用して、データベース内のバージョン番号が保存しているバージョンより1つ少ないことをテストします。

質問の2番目の部分に答えるには、両方の更新が成功します(更新に条件を設定していない場合)。 1つ目は指定された更新を行い、2つ目は更新を上書きします。

10
F_SO_K

Dynamodbは、デフォルトでは楽観的ロックをサポートしていません。すでに述べたように、楽観的ロックを使用するには、Javaモデルクラスのアノテーションを使用する必要があります。

2つのスレッドが同じアイテムに書き込む場合、Dynamodbアイテムには最後の書き込みデータ(つまり、データを書き込む最後のスレッド)があります。

1
notionquest