条件式なしで条件付き書き込みを出荷し、2 人のワーカーが同じアイテムを更新し、 エラーなしに最後の書き込みが勝つ。DynamoDB は SQL 風の行ロックを推論しない — 式で述語を書き下すか、レースを受け入れる。

式は、選択的な読み取りと安全な書き込みの背後にある小さな言語だ。キー条件は Query を絞り、フィルター式は読み取り後に捨て、条件式はアトミックな更新を ゲートし、射影式はペイロードサイズを削る。予約語、#name プレースホルダ、 :value 束縛はどのチームも一度はハマる。このセクションは 4 つの系統を分け、 正しいものを手に取れるようにする。

読み終えたらできること

  • 上書きする代わりに古い書き込みを拒否する条件式を書ける。
  • アイテム全体を送らずに SET/REMOVE/ADD/DELETE 更新式を組み立てられる。
  • インデックスレベルで Query を選択的に保つキー条件を組み立てられる。
  • 予約属性名をエイリアスし、JSON エスケープエラーなしに値を束縛できる。

読む順番

  1. 条件式PutItemUpdateItemDeleteItem 上のアトミックな述語。楽観的ロック。
  2. 更新式 — 読み取り・変更・書き込みの 往復なしの部分更新。
  3. キー条件式 — キャパシティが 課金される前に Query が絞り込めるもの。
  4. 射影式 — UI が必要とする属性だけを 返す。
  5. 式の名前と値 — すべての式タイプが 共有する #status:threshold の仕組み。
6 件中 0 件読了クイズ

更新上の attribute_exists(version) AND version = :v は、負けたレースを リトライできる ConditionalCheckFailedException に変える。Scan 上の フィルター式はそれでもテーブル全体を読む — 式はレスポンス内の行を隠すだけだ。 status は予約語。裸の status = :s#s にエイリアスするまでパースに 失敗する。予約語チェッカー は AWS の 573 個の予約語すべてにフラグを立て、エイリアスを提案する。

キー条件式は、パーティションキーとソートキー上の狭い演算子集合だけを受け付ける — 等価、begins_withbetween、パーティションキーが完全に指定されているときの ソートキー上の比較。キー条件レイヤーで任意の属性をフィルターできない。それが キャパシティ課金後にフィルター式がやることだ。射影式は読み取りと、書き込み後の ReturnValues でレスポンスペイロードを削る。グリッドに決して出さない大きな ブロブをアイテムが抱えているときに効く。

更新式は複数の SETREMOVEADDDELETE 句を 1 つのアトミックな UpdateItem にまとめる。DynoTable のアイテムエディタは、ステージングで フィールドを変えるとこれらの句を生成し、コミット前に正確な式が見える。

DynoTable で

無料の Expression Builder でブラウザ上に 式を組み立てる — 操作を選び、句を足し、JSON を手でエスケープせずに SDK/CLI/boto3/PartiQL スニペットをエクスポートする。

DynoTable ではアイテム編集をステージし、コミット前に diff で 更新式を見る。有料プランがステージングとコミットを解放する。無料の読み取り 専用でも、フィルタービルダーと PartiQL SELECT 経由で射影とフィルター式付きの クエリを組み立ててエクスポートできる。

DynoTable をダウンロードして、ライブアイテムに対してこれらの式を 実行しよう。