本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
TransactWriteItems
TransactWriteItems
请求对象允许您告诉 D AWS AppSync ynamoDB 函数向 DynamoDB 发出写入多个项目(可能写入多个表)的TransactWriteItems
请求。对于该请求对象,您必须指定以下内容:
-
每个请求项目的目标表名称
-
要执行的每个请求项目的操作。支持四种类型的操作:PutItem、UpdateItemDeleteItem、和 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
。