Amazon dynamodb DynamoDB save()API:乐观锁定和保存行为

Amazon dynamodb DynamoDB save()API:乐观锁定和保存行为,amazon-dynamodb,optimistic-locking,Amazon Dynamodb,Optimistic Locking,dynamodb的save API提供了多个属性,包括UPDATE,UPDATE\u SKIP\u NULL\u ATTRIBUTES,CLOBBER,以及APPEND\u SET 根据此方法,如果保存行为为UPDATE,则启用通过版本的乐观锁定属性;如果保存行为为CLOBBER,则禁用该属性。 关于这一点,有两个问题: 为什么有人想禁用乐观锁定?乐观锁定可以让您安全地写入记录 其他保存行为如何?使用UPDATE\u SKIP\u NULL\u属性和APPEND\u SET和版本属性是否有意义?

dynamodb的save API提供了多个属性,包括
UPDATE
UPDATE\u SKIP\u NULL\u ATTRIBUTES
CLOBBER
,以及
APPEND\u SET

根据此方法,如果保存行为为
UPDATE
,则启用通过版本的乐观锁定属性;如果保存行为为
CLOBBER
,则禁用该属性。 关于这一点,有两个问题:

  • 为什么有人想禁用乐观锁定?乐观锁定可以让您安全地写入记录
  • 其他保存行为如何?使用
    UPDATE\u SKIP\u NULL\u属性
    APPEND\u SET
    和版本属性是否有意义?原因是,您可以在调用save()时跳过version属性,这有点难以理解

  • 我将尝试回答您的每个问题:

  • 为什么有人要禁用乐观锁定?乐观锁定可以让您安全地写入记录

  • True-乐观并发使您能够安全地访问记录,但它不是免费的(*),您必须决定更新失败时该怎么做。另一方面,如果表的结构不允许并发更新(例如,您有一个表,其中的项只写入一次,每个项都有一个唯一的键,那么为什么要承担乐观锁的额外成本?)

    (*)具有乐观并发性的
    更新
    要求您首先读取记录,然后尝试更新它,并提供您刚刚读取的版本,这意味着更新成本更高(您必须支付读取和写入的费用,如果存在争用,则可能需要多次读取和写入),并且需要更长的时间(同样,您必须阅读,并且只有在阅读之后才能尝试更新)。如果您有其他方法确保只有一个写入程序可以更新记录,则无需使用乐观并发

  • 其他保存行为如何?使用
    UPDATE\u SKIP\u NULL\u属性
    APPEND\u SET
    添加版本属性是否有意义?原因是,调用save()时可以跳过版本属性,这有点难理解。
  • UPDATE\u SKIP\u NULL\u ATTRIBUTES
    实际上非常强大。它允许您仅对一个项目应用部分更新。假设您有一个复杂的项目,该项目将一个系统的多个组件的状态存储在同一条记录中。当其中一个组件更改状态时,您只需使用
    UPDATE\u SKIP\N应用更新即可ULL_属性
    ,无需担心意外修改其他属性

    APPEND\u SET
    模式类似于
    UPDATE\u SKIP\u NULL\u ATTRIBUTES
    ,但它改变了存储为集合的属性的更新行为,从默认覆盖整个集合到附加到集合。就我个人而言,我没有发现它非常有用,但我可以想象它可能有用

    最后一个问题是,使用类似于
    UPDATE\u SKIP\u NULL\u ATTRIBUTES
    的乐观并发性是否有意义


    我认为这在某种程度上取决于你如何构建你的系统。可以想象有一个表,带有GSI,可以投影每个项目的一部分,带有一个键和版本属性。然后,你可以只从GSI读取你需要的内容,如果你想应用部分更新,你可以乐观地这样做

    “另一方面,如果表的结构不可能同时进行更新"在这种情况下,您可能根本不会定义一个版本。如果已经定义了一个版本,CLOBBER将禁用乐观锁定,这让我感到困惑。没错,但根本不定义版本与CLOBBER基本相同。我想说的一件事是,如果您仍然感到困惑,请尝试阅读DynamoDB文档API,它是t他创建了映射器作为排序基础的底层APIORN@MikeDinescu这是否意味着,如果我想在Dynamo中读取一个值并进行更新,并且由于版本号不匹配而抛出一个ConditionUpdatefailure,我需要编写代码重试,直到成功?或者Dynamo是否已经提供了一些功能是吗?正确-如果操作因条件检查失败错误而失败,则您必须写入重试逻辑,这将涉及重拨项目并重试