式
条件式なしで条件付き書き込みを出荷し、2 人のワーカーが同じアイテムを更新し、 エラーなしに最後の書き込みが勝つ。DynamoDB は SQL 風の行ロックを推論しない — 式で述語を書き下すか、レースを受け入れる。
式は、選択的な読み取りと安全な書き込みの背後にある小さな言語だ。キー条件は
Query を絞り、フィルター式は読み取り後に捨て、条件式はアトミックな更新を
ゲートし、射影式はペイロードサイズを削る。予約語、#name プレースホルダ、
:value 束縛はどのチームも一度はハマる。このセクションは 4 つの系統を分け、
正しいものを手に取れるようにする。
読み終えたらできること
- 上書きする代わりに古い書き込みを拒否する条件式を書ける。
- アイテム全体を送らずに
SET/REMOVE/ADD/DELETE更新式を組み立てられる。 - インデックスレベルで
Queryを選択的に保つキー条件を組み立てられる。 - 予約属性名をエイリアスし、JSON エスケープエラーなしに値を束縛できる。
読む順番
- 条件式 —
PutItem、UpdateItem、DeleteItem上のアトミックな述語。楽観的ロック。 - 更新式 — 読み取り・変更・書き込みの 往復なしの部分更新。
- キー条件式 — キャパシティが
課金される前に
Queryが絞り込めるもの。 - 射影式 — UI が必要とする属性だけを 返す。
- 式の名前と値 — すべての式タイプが
共有する
#statusと:thresholdの仕組み。
更新上の attribute_exists(version) AND version = :v は、負けたレースを
リトライできる ConditionalCheckFailedException に変える。Scan 上の
フィルター式はそれでもテーブル全体を読む — 式はレスポンス内の行を隠すだけだ。
status は予約語。裸の status = :s は #s にエイリアスするまでパースに
失敗する。予約語チェッカー は AWS の
573 個の予約語すべてにフラグを立て、エイリアスを提案する。
キー条件式は、パーティションキーとソートキー上の狭い演算子集合だけを受け付ける —
等価、begins_with、between、パーティションキーが完全に指定されているときの
ソートキー上の比較。キー条件レイヤーで任意の属性をフィルターできない。それが
キャパシティ課金後にフィルター式がやることだ。射影式は読み取りと、書き込み後の
ReturnValues でレスポンスペイロードを削る。グリッドに決して出さない大きな
ブロブをアイテムが抱えているときに効く。
更新式は複数の SET、REMOVE、ADD、DELETE 句を 1 つのアトミックな
UpdateItem にまとめる。DynoTable のアイテムエディタは、ステージングで
フィールドを変えるとこれらの句を生成し、コミット前に正確な式が見える。
DynoTable で
無料の Expression Builder でブラウザ上に 式を組み立てる — 操作を選び、句を足し、JSON を手でエスケープせずに SDK/CLI/boto3/PartiQL スニペットをエクスポートする。
DynoTable ではアイテム編集をステージし、コミット前に diff で
更新式を見る。有料プランがステージングとコミットを解放する。無料の読み取り
専用でも、フィルタービルダーと PartiQL SELECT 経由で射影とフィルター式付きの
クエリを組み立ててエクスポートできる。
DynoTable をダウンロードして、ライブアイテムに対してこれらの式を 実行しよう。