DynamoDB TransactWriteItems di Python (boto3)

transact_write_items mengelompokkan hingga 100 penulisan ke dalam satu operasi all-or-nothing — entah setiap aksi commit, atau tidak ada yang commit. Dengan boto3 low-level client Anda melewatkan sebuah list TransactItems yang mencampur aksi Put, Update, Delete, dan ConditionCheck, masing-masing dengan kondisi opsional.

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']

Penjelasan

  • TransactItems — hingga 100 aksi Put / Update / Delete / ConditionCheck, agregat 4 MB, nilai dalam DynamoDB JSON. Aksi bisa mencakup beberapa tabel (akun + Region yang sama), tetapi tidak boleh ada dua aksi yang menargetkan item yang sama — itu saja membatalkan transaksi.
  • ConditionCheck — menegaskan sebuah kondisi pada item yang tidak dimodifikasi transaksi (mis. "akun masih ada") dan memveto seluruh transaksi jika gagal.
  • TransactionCanceledException — satu-satunya error yang perlu ditangani. e.response["CancellationReasons"] mendaftar satu {"Code", "Message"} per aksi dalam urutan — kode mencakup ConditionalCheckFailed, TransactionConflict (transaksi lain menyentuh sebuah item di tengah jalan — aman untuk dicoba ulang dengan backoff), ProvisionedThroughputExceeded, dan ValidationError; None menandai aksi yang tidak bersalah. Setel "ReturnValuesOnConditionCheckFailure": "ALL_OLD" pada sebuah aksi untuk mendapatkan atribut item yang kalah dalam reason-nya.
  • ClientRequestToken — lewatkan satu untuk membuat panggilan idempotent selama 10 menit; sebuah retry botocore setelah timeout jaringan kemudian tidak bisa menerapkan penulisan dua kali.
  • Biaya — penulisan transaksional mengonsumsi dua penulisan yang mendasari per item (prepare + commit), jadi mereka menagih kira-kira 2× WCU dari penulisan biasa. Jangan meraih transaksi ketika sebuah penulisan bersyarat satu-item sudah memberi Anda atomisitas pada satu item.

Lakukan secara visual

Condition dan update expression di dalam setiap aksi adalah bagian yang rumit — DynamoDB Expression Builder merakitnya dengan map name/value dan menyalin kode boto3 yang bisa dijalankan.

Untuk mengedit item dan meninjau expression yang dihasilkan dalam GUI — unduh DynoTable.

Contoh terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.