Python'da DynamoDB TransactWriteItems (boto3)

transact_write_items, 100'e kadar yazmayı tek bir ya hep ya hiç işleminde gruplar — ya her eylem işlenir ya da hiçbiri işlenmez. boto3 düşük seviyeli istemcisiyle, her biri isteğe bağlı bir koşula sahip Put, Update, Delete ve ConditionCheck eylemlerini karıştıran bir TransactItems listesi geçirirsiniz.

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

Açıklama

  • TransactItems — en fazla 100 Put / Update / Delete / ConditionCheck eylemi, toplamda 4 MB, DynamoDB JSON'daki değerler. Eylemler tablolara yayılabilir (aynı hesap + Bölge), ancak hiçbir iki eylem aynı öğeyi hedefleyemez — bu tek başına işlemi iptal eder.
  • ConditionCheck — işlemin değiştirmediği bir öğe üzerinde bir koşul öne sürer (örneğin "hesap hâlâ mevcut") ve başarısız olursa işlemin tamamını veto eder.
  • TransactionCanceledException — ele alınacak tek hata. e.response["CancellationReasons"], sırayla eylem başına bir {"Code", "Message"} listeler — kodlar ConditionalCheckFailed, TransactionConflict (başka bir işlem ilerleme sırasında bir öğeye dokundu — geri çekilmeyle yeniden denemek güvenli), ProvisionedThroughputExceeded ve ValidationError içerir; None, masum eylemleri işaretler. Kaybeden öğenin özniteliklerini nedeninde almak için bir eyleme "ReturnValuesOnConditionCheckFailure": "ALL_OLD" ayarlayın.
  • ClientRequestToken — çağrıyı 10 dakika boyunca idempotent yapmak için bir tane geçirin; bir ağ zaman aşımından sonra botocore'un bir yeniden denemesi böylece yazmaları iki kez uygulayamaz.
  • Maliyet — işlemsel yazmalar, öğe başına iki altta yatan yazma tüketir (hazırla + işle), bu nedenle düz bir yazmanın kabaca 2× WCU'sunu faturalandırır. Tek öğeli bir koşullu yazma zaten size bir öğede atomiklik veriyorsa işlemlere başvurmayın.

Görsel olarak yapın

Her eylemin içindeki koşul ve güncelleme ifadeleri zahmetli kısımdır — DynamoDB Expression Builder bunları ad/değer eşlemeleriyle bir araya getirir ve çalıştırılabilir boto3 kodunu kopyalar.

Öğeleri düzenlemek ve üretilen ifadeleri bir grafik arayüzde (GUI) gözden geçirmek için — DynoTable'ı indirin.

İlgili örnekler

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.