Node.js'te DynamoDB TransactWriteItems (AWS SDK v3)

TransactWriteItems, 100'e kadar yazmayı tek bir ya hep ya hiç işleminde gruplar — ya her eylem işlenir ya da hiçbiri işlenmez. AWS SDK v3'te, TransactItems dizisi her biri isteğe bağlı bir koşula sahip Put, Update, Delete ve ConditionCheck eylemlerini karıştıran bir TransactWriteItemsCommand gönderirsiniz.

Code

import {DynamoDBClient, TransactWriteItemsCommand} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({region: 'us-east-1'});

// Move one award between two songs — atomically. If the first song has no
// award to give, NEITHER update happens.
const command = new TransactWriteItemsCommand({
  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'}}
      }
    }
  ]
});

try {
  await client.send(command);
  console.log('Transaction committed');
} catch (err) {
  if (err.name === 'TransactionCanceledException') {
    // One reason per action, in TransactItems order. 'None' means that action
    // was fine — some OTHER action sank the transaction.
    const codes = (err.CancellationReasons ?? []).map((r) => r.Code);
    console.log('Transaction canceled:', codes); // e.g. ['ConditionalCheckFailed', 'None']
  } else {
    throw err;
  }
}

Açıklama

  • TransactItems — en fazla 100 Put / Update / Delete / ConditionCheck eylemi, toplamda 4 MB. 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. err.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 bir SDK 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 kodu 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.