Amazon web services TransactionCanceledException中的神秘事务冲突

Amazon web services TransactionCanceledException中的神秘事务冲突,amazon-web-services,transactions,amazon-dynamodb,aws-sdk,Amazon Web Services,Transactions,Amazon Dynamodb,Aws Sdk,在aws sdk(js)中使用,我们得到一个。该异常中的原因为事务冲突。有时事务中的所有操作都失败,有时只有少数操作或一个操作失败。我们并行运行多个事务,可以对相同的项目进行操作。文档中没有提到这个特殊的错误。可能原因摘录: 其中一个条件表达式中的条件不满足 TransactionWriteItems请求中的表位于不同的帐户或帐户中 地区 TransactionWriteItems操作中有多个操作以 同样的项目 配置的容量不足,无法处理事务 完成 项目大小过大(大于400 KB)或本地 二级索引

在aws sdk(js)中使用,我们得到一个。该异常中的原因为事务冲突。有时事务中的所有操作都失败,有时只有少数操作或一个操作失败。我们并行运行多个事务,可以对相同的项目进行操作。文档中没有提到这个特殊的错误。可能原因摘录:

  • 其中一个条件表达式中的条件不满足
  • TransactionWriteItems请求中的表位于不同的帐户或帐户中 地区
  • TransactionWriteItems操作中有多个操作以 同样的项目
  • 配置的容量不足,无法处理事务 完成
  • 项目大小过大(大于400 KB)或本地 二级索引(LSI)变得太大,或出现类似的验证错误 由于事务所做的更改而发生
  • 存在用户错误,例如无效的数据格式

  • 这些都不适用,当重试事务时,它似乎最终会工作。有人知道这个例外吗?我找不到任何文档记录。

    您遇到的不是一个bug,它实际上是该功能的一部分,并且在中提到过

    在事务处理期间,项目不会被锁定。DynamoDB事务提供可序列化的隔离。如果在事务进行期间在事务外部修改了某个项目,则事务将被取消,并引发异常,其中包含导致异常的一个或多个项目的详细信息

    另一方面,DynamoDB没有使用锁定,而是使用了一种称为乐观并发控制(也被(令人困惑地)称为乐观锁定)的方法。如果你有兴趣了解更多这方面的信息,维基百科上的文章就相当不错了

    回到手头上的事情,AWS for transactions说:

    同时更新相同项目的多个事务可能会导致取消事务的冲突。我们建议遵循DynamoDB数据建模的最佳实践,以尽量减少此类冲突

    专门针对TransactionWriteItems,他们说:

    写入事务在以下情况下不成功:

    正在进行的TransactionWriteItems操作与TransactionWriteItems操作中一个或多个项目的并发TransactionWriteItems请求冲突时。在这种情况下,并发请求失败,出现TransactionCancelledException

    类似地,TransactiveGetItems:

    在以下情况下,读取事务不会成功:

    正在进行的Transact-GetItems操作与并发PutItem、UpdateItem、DeleteItem或Transact-WriteItems请求冲突时。在这种情况下,TransactionGetItems操作失败,出现TransactionCancelledException


    TransactionConflict似乎意味着#3,您提到您确实运行了多个并行事务,可以对相同的项目进行操作。如果是因为冲突,那么重试最终会起作用,这就是你所说的正在发生的事情。“你确定不是3号吗?”马修波普3号谈到了交易记录。这些是同一事务中的项目,而不是不同事务中的项目。所以,是的,我很确定不是3。没有提到平行交易是一个问题。对不起,我误读了#3。不过,事务(通常)的工作方式是它们基本上锁定请求中的项。事务冲突可能意味着有另一个操作与该事务冲突。@MatthewPope,我也这么认为。然而,从历史上看,Dynamodb实际上没有任何写入冲突需要处理(类似于s3)。我怀疑AWS是否会悄悄地将它们添加到新的事务功能中而不提及它。所以可能是一只虫子。下一步我会在他们的论坛上发帖子。非常感谢。当我浏览文档时,我完全没有注意到这一点。至少下一个遇到错误的人现在会将此票据作为参考!干杯