TransactWriteItems - AWS AppSync

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

TransactWriteItems

TransactWriteItems请求对象允许您告诉 D AWS AppSync ynamoDB 函数向 DynamoDB 发出写入多个项目(可能写入多个表)的TransactWriteItems请求。对于该请求对象,您必须指定以下内容:

  • 每个请求项目的目标表名称

  • 要执行的每个请求项目的操作。支持四种类型的操作:PutItemUpdateItemDeleteItem、和 ConditionCheck

  • 要写入的每个请求项目的键

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 字段

字段定义如下:
operation

要执行的 DynamoDB 操作。要执行 TransactWriteItems DynamoDB 操作,该字段必须设置为 TransactWriteItems。该值为必填项。

transactItems

要包含的请求项目。该值是请求项目的数组。必须提供至少一个请求项目。该 transactItems 值为必填项。

对于 PutItem,字段定义如下:

table

目标 DynamoDB 表。该值是表名的字符串。该 table 值为必填项。

operation

要执行的 DynamoDB 操作。要执行 PutItem DynamoDB 操作,该字段必须设置为 PutItem。该值为必填项。

key

DynamoDB 键,表示要放置的项目的主键。DynamoDB 项目可能具有单个哈希键,也可能具有哈希键和排序键,具体取决于表结构。有关如何指定“类型化值”的更多信息,请参阅类型系统(请求映射)。该值为必填项。

attributeValues

要放入 DynamoDB 中的项目的其余属性。有关如何指定“类型化值”的更多信息,请参阅类型系统(请求映射)。该字段是可选的。

condition

根据 DynamoDB 中已有的对象状态,确定请求是否应成功的条件。如果未指定条件,则 PutItem 请求将覆盖该项目的任何现有条目。您可以指定在状况检查失败时是否重新检索现有项目。有关事务条件的更多信息,请参阅事务条件表达式。该值为可选项。

对于 UpdateItem,字段定义如下:

table

要更新的 DynamoDB 表。该值是表名的字符串。该 table 值为必填项。

operation

要执行的 DynamoDB 操作。要执行 UpdateItem DynamoDB 操作,该字段必须设置为 UpdateItem。该值为必填项。

key

DynamoDB 键,表示要更新的项目的主键。DynamoDB 项目可能具有单个哈希键,也可能具有哈希键和排序键,具体取决于表结构。有关如何指定“类型化值”的更多信息,请参阅类型系统(请求映射)。该值为必填项。

update

update 部分用于指定一个更新表达式,以描述如何更新 DynamoDB 中的项目。有关如何编写更新表达式的更多信息,请参阅 DynamoDB 文档 UpdateExpressions 。此部分是必需的。

condition

根据 DynamoDB 中已有的对象状态,确定请求是否应成功的条件。如果未指定条件,则 UpdateItem 请求将更新现有条目,而不考虑其当前状态。您可以指定在状况检查失败时是否重新检索现有项目。有关事务条件的更多信息,请参阅事务条件表达式。该值为可选项。

对于 DeleteItem,字段定义如下:

table

要在其中删除项目的 DynamoDB 表。该值是表名的字符串。该 table 值为必填项。

operation

要执行的 DynamoDB 操作。要执行 DeleteItem DynamoDB 操作,该字段必须设置为 DeleteItem。该值为必填项。

key

DynamoDB 键,表示要删除的项目的主键。DynamoDB 项目可能具有单个哈希键,也可能具有哈希键和排序键,具体取决于表结构。有关如何指定“类型化值”的更多信息,请参阅类型系统(请求映射)。该值为必填项。

condition

根据 DynamoDB 中已有的对象状态,确定请求是否应成功的条件。如果未指定条件,则 DeleteItem 请求将删除项目,而不考虑其当前状态。您可以指定在状况检查失败时是否重新检索现有项目。有关事务条件的更多信息,请参阅事务条件表达式。该值为可选项。

对于 ConditionCheck,字段定义如下:

table

要在其中检查条件的 DynamoDB 表。该值是表名的字符串。该 table 值为必填项。

operation

要执行的 DynamoDB 操作。要执行 ConditionCheck DynamoDB 操作,该字段必须设置为 ConditionCheck。该值为必填项。

key

DynamoDB 键,表示要检查条件的项目的主键。DynamoDB 项目可能具有单个哈希键,也可能具有哈希键和排序键,具体取决于表结构。有关如何指定“类型化值”的更多信息,请参阅类型系统(请求映射)。该值为必填项。

condition

根据 DynamoDB 中已有的对象状态,确定请求是否应成功的条件。您可以指定在状况检查失败时是否重新检索现有项目。有关事务条件的更多信息,请参阅事务条件表达式。该值为必填项。

要记住的事项:

  • 如果成功,响应中只返回请求项目的键。键的顺序将与请求项目的顺序相同。

  • 交易是以 all-or-nothing某种方式进行的。如果任何请求项目导致错误,则整个交易都不会执行,并返回错误详细信息。

  • 不能有两个请求项目针对同一个项目。否则,它们会导致TransactionCanceledException错误。

  • 如果交易的错误是 TransactionCanceledException,则cancellationReasons区块将被填充。如果请求项目的条件检查失败 您没有将 returnValuesOnConditionCheckFailure 指定为 false,则表中存在的项目将被检索并存储在 cancellationReasons 块的相应位置的 item 中。

  • 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 请求的条件检查失败而导致事务失败,则 ctx.result 中提供的调用结果如下所示:

{ "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 包含有关该错误的详细信息。钥匙和保证cancellationReasons在里面ctx.result