

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# TransactWriteItems
<a name="js-aws-appsync-resolver-reference-dynamodb-transact-write-items"></a>

`TransactWriteItems` リクエストオブジェクトを使用すると、 AWS AppSync DynamoDB 関数に、複数のテーブルに複数の項目を書き込むように DynamoDB に`TransactWriteItems`リクエストするように指示できます。このリクエストオブジェクトでは、以下の情報を指定する必要があります。
+ 各リクエスト項目の書き込み先テーブル名
+ 実行する各リクエスト項目のオペレーション。サポートされているオペレーションには、*PutItem*、*UpdateItem*、*DeleteItem*、および *ConditionCheck* の 4 種類があります。
+ 書き込む各リクエスト項目のキー

DynamoDB の `TransactWriteItems` 制限が適用されます。

`TransactWriteItems` リクエストオブジェクトのノードの構造は次のとおりです。

```
type DynamoDBTransactWriteItemsRequest = {
  operation: 'TransactWriteItems';
  transactItems: TransactItem[];
};
type TransactItem =
  | TransactWritePutItem
  | TransactWriteUpdateItem
  | TransactWriteDeleteItem
  | TransactWriteConditionCheckItem;
type TransactWritePutItem = {
  table: string;
  operation: 'PutItem';
  key: { [key: string]: any };
  attributeValues: { [key: string]: string};
  condition?: TransactConditionCheckExpression;
};
type TransactWriteUpdateItem = {
  table: string;
  operation: 'UpdateItem';
  key: { [key: string]: any };
  update: DynamoDBExpression;
  condition?: TransactConditionCheckExpression;
};
type TransactWriteDeleteItem = {
  table: string;
  operation: 'DeleteItem';
  key: { [key: string]: any };
  condition?: TransactConditionCheckExpression;
};
type TransactWriteConditionCheckItem = {
  table: string;
  operation: 'ConditionCheck';
  key: { [key: string]: any };
  condition?: TransactConditionCheckExpression;
};
type TransactConditionCheckExpression = {
  expression: string;
  expressionNames?: { [key: string]: string};
  expressionValues?: { [key: string]: any};
  returnValuesOnConditionCheckFailure: boolean;
};
```

## TransactWriteItems フィールド
<a name="js-TransactWriteItems-list"></a>

### TransactWriteItems フィールドリスト
<a name="js-TransactWriteItems-list-col"></a>

**各フィールドの定義は以下のようになります。**    
** `operation` **  
実行する DynamoDB の処理。`TransactWriteItems` DynamoDB の処理を実行するには、これを `TransactWriteItems` に設定する必要があります。この値は必須です。  
** `transactItems` **  
含めるリクエスト項目。値はリクエスト項目の配列です。少なくとも 1 つのリクエスト項目を指定する必要があります。この `transactItems` の値は必須です。  
`PutItem` の場合、各フィールドの定義は以下のようになります。    
** `table` **  
送信先のの DynamoDB テーブル。値はテーブル名の文字列です。この `table` の値は必須です。  
** `operation` **  
実行する DynamoDB の処理。`PutItem` DynamoDB の処理を実行するには、これを `PutItem` に設定する必要があります。この値は必須です。  
** `key` **  
配置する項目のプライマリキーを表す DynamoDB キー。DynamoDB の項目には、単一のハッシュキー、またはハッシュキーとソートキーが含まれています。これはテーブルの構造によって変わります。「型付き値」を指定する方法の詳細については、「[型システム (リクエストマッピング)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)」を参照してください。この値は必須です。  
** `attributeValues` **  
DynamoDB に渡す項目の残りの属性です。「型付き値」を指定する方法の詳細については、「[型システム (リクエストマッピング)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)」を参照してください。このフィールドはオプションです。  
** `condition` **  
DynamoDB 内に既に存在するオブジェクトの状態に基づき、リクエストが成功するかどうかを判断する条件です。条件が指定されていない場合、`PutItem` リクエストはその項目の既存のエントリを上書きします。条件チェックに失敗した場合に、既存の項目を取得し直すかどうかを指定できます。トランザクション条件の詳細については、「[トランザクション条件式](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions)」を参照してください。この値はオプションです。
`UpdateItem` の場合、各フィールドの定義は以下のようになります。    
** `table` **  
更新する DynamoDB テーブル。値はテーブル名の文字列です。この `table` の値は必須です。  
** `operation` **  
実行する DynamoDB の処理。`UpdateItem` DynamoDB の処理を実行するには、これを `UpdateItem` に設定する必要があります。この値は必須です。  
** `key` **  
更新する項目のプライマリキーを表す DynamoDB キー。DynamoDB の項目には、単一のハッシュキー、またはハッシュキーとソートキーが含まれています。これはテーブルの構造によって変わります。「型付き値」を指定する方法の詳細については、「[型システム (リクエストマッピング)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)」を参照してください。この値は必須です。  
** `update` **  
`update` セクションには、 DynamoDBの項目の更新方法を示す更新式を指定することができます。更新式の記述方法の詳細については、「[DynamoDB UpdateExpressions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html)」のドキュメントを参照してください。このセクションは必須です。  
** `condition` **  
DynamoDB 内に既に存在するオブジェクトの状態に基づき、リクエストが成功するかどうかを判断する条件です。条件を指定していない場合は、`UpdateItem` リクエストによって、現在の状態にかかわらず、既存のエントリが更新されます。条件チェックに失敗した場合に、既存の項目を取得し直すかどうかを指定できます。トランザクション条件の詳細については、「[トランザクション条件式](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions)」を参照してください。この値はオプションです。
`DeleteItem` の場合、各フィールドの定義は以下のようになります。    
** `table` **  
項目を削除する DynamoDB テーブル。値はテーブル名の文字列です。この `table` の値は必須です。  
** `operation` **  
実行する DynamoDB の処理。`DeleteItem` DynamoDB の処理を実行するには、これを `DeleteItem` に設定する必要があります。この値は必須です。  
** `key` **  
削除する項目のプライマリキーを表す DynamoDB キー。DynamoDB の項目には、単一のハッシュキー、またはハッシュキーとソートキーが含まれています。これはテーブルの構造によって変わります。「型付き値」を指定する方法の詳細については、「[型システム (リクエストマッピング)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)」を参照してください。この値は必須です。  
** `condition` **  
DynamoDB 内に既に存在するオブジェクトの状態に基づき、リクエストが成功するかどうかを判断する条件です。条件を指定していない場合、`DeleteItem` リクエストによって、現在の状態にかかわらず、項目が削除されます。条件チェックに失敗した場合に、既存の項目を取得し直すかどうかを指定できます。トランザクション条件の詳細については、「[トランザクション条件式](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions)」を参照してください。この値はオプションです。
`ConditionCheck` の場合、各フィールドの定義は以下のようになります。    
** `table` **  
条件をチェックする DynamoDB テーブル。値はテーブル名の文字列です。この `table` の値は必須です。  
** `operation` **  
実行する DynamoDB の処理。`ConditionCheck` DynamoDB の処理を実行するには、これを `ConditionCheck` に設定する必要があります。この値は必須です。  
** `key` **  
条件チェックする項目のプライマリキーを表す DynamoDB キー。DynamoDB の項目には、単一のハッシュキー、またはハッシュキーとソートキーが含まれています。これはテーブルの構造によって変わります。「型付き値」を指定する方法の詳細については、「[型システム (リクエストマッピング)](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-typed-values-request)」を参照してください。この値は必須です。  
** `condition` **  
DynamoDB 内に既に存在するオブジェクトの状態に基づき、リクエストが成功するかどうかを判断する条件です。条件チェックに失敗した場合に、既存の項目を取得し直すかどうかを指定できます。トランザクション条件の詳細については、「[トランザクション条件式](https://docs.aws.amazon.com/appsync/latest/devguide/js-resolver-reference-dynamodb.html#js-aws-appsync-resolver-reference-dynamodb-transaction-condition-expressions)」を参照してください。この値は必須です。

覚えておくべきポイント:
+ リクエスト項目のキーのみがレスポンスに返されます (正常に挿入された場合)。キーの順序は、リクエスト項目の順序と同じです。
+ トランザクションは、オールオアナッシング方式で実行されます。いずれかのリクエスト項目でエラーが発生した場合、トランザクション全体は実行されず、エラーの詳細が返されます。
+ 同じ項目をターゲットにできるリクエスト項目が 2 つありません。それ以外の場合は、*TransactionCanceledException* エラーが発生します。
+ トランザクションのエラーが *TransactionCanceledException* である場合、`cancellationReasons` ブロックに入力されます。リクエスト項目の条件チェックが失敗し、**かつ** `returnValuesOnConditionCheckFailure` を `false` に指定しなかった場合、テーブルに存在する項目が取得され、`item` で `cancellationReasons` ブロックの対応する位置に保存されます。
+  `TransactWriteItems` のリクエスト項目数は 100 個に制限されています。
+ このオペレーション、競合検出で使用するとサポート**されていません**。両方を同時に使用すると、エラーが発生する可能性があります。

次の例の関数リクエストハンドラーの場合:

```
import { util } from '@aws-appsync/utils';

export function request(ctx) {
  const { authorId, postId, title, description, oldTitle, authorName } = ctx.args;
  return {
    operation: 'TransactWriteItems',
    transactItems: [
      {
        table: 'posts',
        operation: 'PutItem',
        key: util.dynamodb.toMapValues({ postId }),
        attributeValues: util.dynamodb.toMapValues({ title, description }),
        condition: util.transform.toDynamoDBConditionExpression({
          title: { eq: oldTitle },
        }),
      },
      {
        table: 'authors',
        operation: 'UpdateItem',
        key: util.dynamodb.toMapValues({ authorId }),
        update: {
          expression: 'SET authorName = :name',
          expressionValues: util.dynamodb.toMapValues({ ':name': authorName }),
        },
      },
    ],
  };
}
```

トランザクションが成功した場合、`ctx.result` で使用できる呼び出し結果は次のようになります。

```
{
    "keys": [
       // Key of the PutItem request
       {
           "post_id": "p1",
       },
       // Key of the UpdateItem request
       {
           "author_id": "a1"
       }
    ],
    "cancellationReasons": null
}
```

`PutItem` リクエストの条件チェックに失敗したためにトランザクションが失敗した場合、 で使用できる呼び出し結果は次のようになります。

```
{
    "keys": null,
    "cancellationReasons": [
       {
           "item": {
               "post_id": "p1",
               "post_title": "Actual old title",
               "post_description": "Old description"
           },
           "type": "ConditionCheckFailed",
           "message": "The condition check failed."
       },
       {
           "type": "None",
           "message": "None"
       }
    ]
}
```

`ctx.error` にエラーに関する詳細が含まれています。**keys** および **cancellationReasons** が `ctx.result` に存在することが保証されています。