DynamoDB Conditional Write mit der AWS CLI

Ein bedingter Schreibvorgang hängt eine --condition-expression an put-item, update-item oder delete-item: DynamoDB wertet sie gegen das aktuelle Item aus und wendet den Schreibvorgang nur an, wenn sie zutrifft — atomar, ohne Read-Modify-Write-Race. Es ist DynamoDBs Primitive für optimistisches Locking. Dieses Beispiel sichert ein Update mit einer Versionsprüfung ab.

Code

aws dynamodb update-item \
  --table-name 'Music' \
  --key '{"Artist":{"S":"Arturo Sandoval"},"SongTitle":{"S":"Cubano Chant"}}' \
  --update-expression 'SET #upd0 = :updValue0, #version = :newVersion' \
  --condition-expression 'attribute_exists(#cond0) AND #version = :expectedVersion' \
  --expression-attribute-names '{"#upd0":"Genre","#version":"Version","#cond0":"Artist"}' \
  --expression-attribute-values '{":updValue0":{"S":"Latin Jazz"},":expectedVersion":{"N":"7"},":newVersion":{"N":"8"}}'

Bei Erfolg gibt der Befehl nichts aus und beendet sich mit 0. Kam ein anderer Writer zuerst, scheitert die Bedingung:

An error occurred (ConditionalCheckFailedException) when calling the UpdateItem operation:
The conditional request failed

Erklärung

  • --condition-expressionatomar mit dem Schreibvorgang gegen das gespeicherte Item geprüft. Verfügbare Funktionen: attribute_exists, attribute_not_exists, attribute_type, contains, begins_with, size, plus Vergleichsoperatoren (=, <>, <, >, <=, >=, BETWEEN, IN) und AND/OR/NOT.
  • Die zwei Standard-Idiome:
    • attribute_exists(#key) bei einem Update = "nur aktualisieren, nie anlegen". Ohne es legt update-item auf einen fehlenden Schlüssel stillschweigend das Item an (der versehentliche Upsert-Bug).
    • attribute_not_exists(#key) bei einem Put = "nur anlegen, nie überschreiben" — gezeigt auf der PutItem-Seite.
  • Optimistisches Locking — lies das Item (Version 7), dann schreibe mit #version = :expectedVersion und erhöhe auf 8. Zwei gleichzeitige Writer können nicht beide gewinnen; der Verlierer beendet sich mit einem Wert ungleich null und ConditionalCheckFailedException, liest neu und wiederholt auf der neuen Version.
  • --return-values-on-condition-check-failure ALL_OLD — bittet DynamoDB, das aktuelle Item an den Fehler anzuhängen (gültige Werte ALL_OLD | NONE; keine Lesekapazität verbraucht). Die SDKs geben dieses Item an der Exception aus; die Standard-Fehlerausgabe der CLI druckt nur die Meldung, daher lesen Skripte nach einem Fehler meist mit get-item neu.
  • Ein gescheiterter bedingter Schreibvorgang berechnet trotzdem den Schreibversuch — nutze Bedingungen nicht als kostenlose Existenzprüfung.

Visuell erledigen

Bedingungsausdrücke sind genau das, was der DynamoDB Expression Builder baut — wähle die Funktion, erhalte den Ausdruck + Name-/Wert-Zuordnungen als lauffertigen CLI-Befehl.

Um Items mit generierten, überprüfbaren Ausdrücken zu bearbeiten statt mit Shell-gequoteten Platzhaltern — lade DynoTable herunter.

Verwandte Beispiele

References

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.