DynamoDB TransactWriteItems in Python (boto3)

transact_write_items gruppiert bis zu 100 Schreibvorgänge in eine Alles-oder-nichts-Operation — entweder committen alle Aktionen, oder keine. Mit dem boto3-Low-Level-Client übergibst du eine TransactItems-Liste, die Put-, Update-, Delete- und ConditionCheck-Aktionen mischt, jede mit einer optionalen Bedingung.

Code

import boto3

client = boto3.client("dynamodb")

# Move one award between two songs — atomically. If the first song has no
# award to give, NEITHER update happens.
try:
    client.transact_write_items(
        TransactItems=[
            {
                "Update": {
                    "TableName": "Music",
                    "Key": {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
                    "UpdateExpression": "SET #upd0 = #upd0 - :one",
                    "ConditionExpression": "#upd0 >= :one",
                    "ExpressionAttributeNames": {"#upd0": "Awards"},
                    "ExpressionAttributeValues": {":one": {"N": "1"}},
                }
            },
            {
                "Update": {
                    "TableName": "Music",
                    "Key": {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "A Mis Abuelos"}},
                    "UpdateExpression": "SET #upd0 = if_not_exists(#upd0, :zero) + :one",
                    "ExpressionAttributeNames": {"#upd0": "Awards"},
                    "ExpressionAttributeValues": {":one": {"N": "1"}, ":zero": {"N": "0"}},
                }
            },
        ]
    )
    print("Transaction committed")
except client.exceptions.TransactionCanceledException as e:
    # One reason per action, in TransactItems order. Code "None" means that
    # action was fine — some OTHER action sank the transaction.
    codes = [reason["Code"] for reason in e.response["CancellationReasons"]]
    print(f"Transaction canceled: {codes}")  # e.g. ['ConditionalCheckFailed', 'None']

Erklärung

  • TransactItems — bis zu 100 Put / Update / Delete / ConditionCheck-Aktionen, 4 MB aggregiert, Werte in DynamoDB JSON. Aktionen können sich über Tabellen erstrecken (gleiches Konto + gleiche Region), aber keine zwei Aktionen dürfen dasselbe Item betreffen — das allein bricht die Transaktion ab.
  • ConditionCheck — behauptet eine Bedingung auf einem Item, das die Transaktion nicht verändert (z. B. "das Konto existiert noch"), und legt sein Veto gegen die gesamte Transaktion ein, falls sie scheitert.
  • TransactionCanceledException — der einzige Fehler, den man behandeln muss. e.response["CancellationReasons"] listet ein {"Code", "Message"} pro Aktion in Reihenfolge — Codes umfassen ConditionalCheckFailed, TransactionConflict (eine andere Transaktion berührte ein Item mitten im Vorgang — sicher mit Backoff zu wiederholen), ProvisionedThroughputExceeded und ValidationError; None markiert die unschuldigen Aktionen. Setze "ReturnValuesOnConditionCheckFailure": "ALL_OLD" auf eine Aktion, um die Attribute des verlierenden Items in ihrem Reason zu bekommen.
  • ClientRequestToken — übergib eines, um den Aufruf für 10 Minuten idempotent zu machen; ein botocore-Retry nach einem Netzwerk-Timeout kann die Schreibvorgänge dann nicht zweimal anwenden.
  • Kosten — transaktionale Schreibvorgänge verbrauchen zwei zugrunde liegende Schreibvorgänge pro Item (prepare + commit), berechnen also ungefähr das 2× der WCUs eines einfachen Schreibvorgangs. Greif nicht zu Transaktionen, wenn ein einzelner bedingter Schreibvorgang dir bereits Atomizität auf einem Item gibt.

Visuell erledigen

Die Bedingungs- und Update-Ausdrücke innerhalb jeder Aktion sind der knifflige Teil — der DynamoDB Expression Builder setzt sie mit den Name-/Wert-Zuordnungen zusammen und kopiert lauffähigen boto3-Code.

Um Items zu bearbeiten und die generierten Ausdrücke in einer GUI zu überprüfen — 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.