AWS CLI ile DynamoDB TransactWriteItems
İşlemin tamamı aws dynamodb transact-write-items'a tek bir --transact-items JSON dizisi olarak gider; dolayısıyla ilginç kısım CLI'nin kenarlarıdır: tırnaklamanın nerede bozulduğu, çıkış kodunun ne anlama geldiği ve varsayılan hata çıktısının bir iptali ayıklamak için gereken alanı düşürdüğü gerçeği. Bir işlemin size ne kazandırdığı her SDK'da aynıdır.
Kod
aws dynamodb transact-write-items \
--transact-items '[
{
"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"}}
}
}
]'İşlenen bir işlem hiçbir şey yazdırmaz ve 0 ile çıkar. Kontrol edilecek bir yanıt gövdesi yoktur, dolayısıyla bir betikte sonuç çıkış kodudur.
Açıklama
--transact-items— 100'e kadarPut/Update/Delete/ConditionCheckeylemi, toplamda 4 MB, değerler DynamoDB JSON biçiminde. Eylemler aynı hesap ve bölgedeki tablolara yayılabilir ve hiçbir ikisi aynı öğeyi hedefleyemez.Üç çıkış kodu, üç farklı başarısızlık.
0işlendi.252, CLI'nin kendi parametre doğrulamasının isteği reddettiği ve hiçbir şeyin gönderilmediği anlamına gelir.254, DynamoDB'nin yanıt verip hayır dediği anlamına gelir. Bu ayrım üzerinden dallanmaya değer: 252 JSON'unuzdaki bir hatadır, 254 ise başarısız olmasını beklediğiniz bir koşul olabilir.Varsayılan hata biçimi eylem başına nedenleri düşürür. aws-cli v2 özeti yazdırır, sonra ayrıntıyı sakladığını söyler:
aws: [ERROR]: An error occurred (TransactionCanceledException) when calling the TransactWriteItems operation: Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None] Additional error details: CancellationReasons: <complex value> Use "--cli-error-format json" or another error format to see the full details.Aynı komutu
--cli-error-format jsonile yeniden çalıştırın; yapı, eylem başına bir girdi olacak şekilde ve--transact-itemssırasında, bozulmadan gelir:{ "Message": "Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None]", "Code": "TransactionCanceledException", "CancellationReasons": [ { "Code": "ConditionalCheckFailed", "Message": "The conditional request failed" }, { "Code": "None" } ] }Burada ilk güncellemenin
Awards >= 1koşulu başarısız oldu;Noneikinci eylemi masum olarak işaretler ve hiçMessagealanı taşımadığına dikkat edin. Diğer her kod TransactionCanceledException sayfasında çözümleniyor.Bir öğeyi iki kez hedeflemek bir iptal değildir. Hiçbir şey denenmeden önce doğrulamada başarısız olur; yazdırılacak neden olmamasının sebebi de budur:
aws: [ERROR]: An error occurred (ValidationException) when calling the TransactWriteItems operation: Transaction request cannot include multiple operations on one itemConditionCheck— işlemin değiştirmediği bir öğe üzerinde bir koşul öne sürer ve başarısız olursa işlemin tamamını veto eder.--client-request-token— sabit bir belirteç, yeniden çalıştırmaları 10 dakika boyunca idempotent kılar. Aynı belirteci herhangi bir parametre değişmiş hâlde yeniden kullanın; DynamoDB yeni yükü sessizce uygulamak yerineIdempotentParameterMismatchdöndürür.Diziyi bir dosyada tutun.
--transact-items file://transaction.jsonkabuk tırnaklamasını tamamen aradan çıkarır ve dosyanın farkı alınabilir.
2× kabuktan ölçülebilir
Aynı tek öğelik güncellemeyi iki kez çalıştırın, bir kez işlem içinde bir kez dışında, ikisini de --return-consumed-capacity TOTAL ile. DynamoDB Local, işlemsel yazma için 2.0, düz olan için 1.0 kapasite birimi bildirir: hazırlık ve işleme, her biri ayrı faturalanır.
Varsayılan olarak bir işleme uzanmaya karşı tüm argüman budur. Tek bir öğe üzerinde atomiklik için elinizde zaten daha ucuz bir araç var: bir kez faturalanan koşullu yazma. Bunu milyonlarca kez yapan bir iş yükünü fiyatlandırmak için DynamoDB fiyatlandırma hesaplayıcısı ikiye katlanmış yazma sayısını doğrudan alır. Bırakmak istediğiniz kısım kabukta DynamoDB JSON kurmaksa, DynoTable öğeleri gerçek bir tabloya karşı düzenler ve size ürettiği ifadeyi gösterir.
İlgili örnekler
- Node.js'te DynamoDB TransactWriteItems — AWS SDK v3 ile aynı işlem.
- Python'da DynamoDB TransactWriteItems — boto3 ile aynı işlem.
- AWS CLI ile DynamoDB BatchWriteItem — atomikliğe ihtiyacınız olmadığında toplu yazmalar.
- DynamoDB işlemleri — yalıtım, idempotentlik ve işlemler ne zaman değer.
- DynamoDB TransactionCanceledException — her iptal nedeni kodu, çözümlenmiş hâliyle.
- "Too many actions in a TransactWriteItems call" — 100 eylem ve 4 MB işlem sınırları.
- "Transaction request cannot include multiple operations on one item" — işlem başına, öğe başına bir eylem.
Kaynaklar
- TransactWriteItems — Amazon DynamoDB API Reference
- transact-write-items — AWS CLI Command Reference
- Amazon DynamoDB transactions: how it works — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.