DynamoDB save() API:乐观锁定和 SaveBehavior

DynamoDB save() API: Optimistic Locking and SaveBehavior

dynamodb的存档API提供了多个save-behaviors包括UPDATE,UPDATE_SKIP_NULL_ATTRIBUTES,CLOBBER,APPEND_SET.

根据此 doc 如果保存行为为 UPDATE,则通过版本属性启用乐观锁定,如果为 CLOBBER,则禁用。 关于此的两个问题:

  1. 为什么有人想要禁用开放式锁定?乐观锁定让您安全地写入您的记录!
  2. 其他保存行为呢?将 UPDATE_SKIP_NULL_ATTRIBUTESAPPEND_SET 与版本属性一起使用是否有意义?原因是,您可以在调用 save() 时简单地跳过版本属性,这有点难以理解。

我会尽量回答你的每一个问题:

  1. 为什么有人要禁用开放式锁定?乐观锁定让您可以安全地写入您的记录!

正确 - 乐观并发让您可以安全地访问您的记录,但它不是免费的 (*),并且您必须决定在更新失败时要做什么。另一方面,如果 table 的结构使得不可能进行并发更新(例如,您有一个 table,其中项目只写入一次,每个项目都有一个唯一的键,那么为什么承担乐观锁的额外成本?)

(*) 具有乐观并发的 UPDATE 要求您首先读取记录,然后尝试更新它以提供您刚刚读取的版本,这意味着它更昂贵(您必须支付对于读取和写入,如果存在争用,可能会进行多次读取和写入)并且需要更长的时间(您必须再次读取,然后才能尝试更新)。如果你有其他方法可以确保只有一个写入者可以更新记录,则不需要使用乐观并发。

  1. 另一个save-behaviors呢?将 UPDATE_SKIP_NULL_ATTRIBUTESAPPEND_SET 与版本属性一起使用是否有意义?原因是,您可以在调用 save() 时简单地跳过版本属性,这有点难以理解。

UPDATE_SKIP_NULL_ATTRIBUTES其实还是挺厉害的。它使您能够仅对项目应用部分更新。假设您有一个复杂的项目,它存储系统多个组件的状态,所有组件都在同一条记录中。当其中一个组件更改状态时,您可以简单地使用 UPDATE_SKIP_NULL_ATTRIBUTES 应用更新,而不必担心不小心修改其他属性。

APPEND_SET 模式与 UPDATE_SKIP_NULL_ATTRIBUTES 类似,但它将更新存储为集合的属性的行为从默认的覆盖整个集合更改为附加到集合。就我个人而言,我还没有发现它非常有用,但我可以想象它可能很有用。

最后一个问题是,使用 UPDATE_SKIP_NULL_ATTRIBUTES 和乐观并发

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