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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DynamoDB save()API:乐观锁定和SaveBehavior相关的知识,希望对你有一定的参考价值。

dynamodb的save API提供了多个save-behaviors,包括UPDATEUPDATE_SKIP_NULL_ATTRIBUTESCLOBBERAPPEND_SET

根据这个doc,如果保存行为是UPDATE,则启用Optimistic Locking via version属性,如果它是CLOBBER则禁用。关于这个的两个问题:

  1. 为什么有人想禁用乐观锁定?乐观锁定可以让您安全地写入您的记录!
  2. 其他保存行为怎么样?将UPDATE_SKIP_NULL_ATTRIBUTESAPPEND_SET与版本属性一起使用是否有意义?原因是,您可以在调用save()时跳过version属性,这有点难以消化。
答案

我会尝试回答你的每个问题:

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

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

(*)具有乐观并发性的UPDATE要求您首先读取记录,然后尝试更新它,提供您刚读取的版本,这意味着它更昂贵(您必须为读取和写入付费,可能是多个如果存在争用则读取和写入并且需要更长时间(再次,您必须阅读并且之后才能尝试更新)。如果您有另一种方法来确保只有一个编写器可以更新记录,则无需使用乐观并发。

  1. 其他保存行为怎么样?将UPDATE_SKIP_NULL_ATTRIBUTESAPPEND_SET与版本属性一起使用是否有意义?原因是,您可以在调用save()时跳过version属性,这有点难以消化。

UPDATE_SKIP_NULL_ATTRIBUTES实际上非常强大。它使您只能对项目应用部分更新。假设您有一个复杂的项目,它存储系统的多个组件的状态,所有这些都在同一记录中。当其中一个组件改变状态时,您可以简单地使用UPDATE_SKIP_NULL_ATTRIBUTES应用更新,而不必担心意外修改其他属性。

APPEND_SET模式类似于UPDATE_SKIP_NULL_ATTRIBUTES但它改变了存储为集合的属性的更新行为,从默认覆盖整个集合到附加到集合。就个人而言,我没有发现它超级有用,但我可以想象它可能是有用的。

最后一个问题是,使用UPDATE_SKIP_NULL_ATTRIBUTES和乐观并发这样的东西甚至是有意义的

我认为这取决于你如何构建你的系统。可以想象有一个表,其中GSI用于生成每个项目的部分,具有键和版本属性。然后,您只能从GSI中读取您需要的内容,然后如果您想应用部分更新,您可以乐观地做到这一点。

以上是关于DynamoDB save()API:乐观锁定和SaveBehavior的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB 默认有锁定吗?

DynamoDB 乐观锁

乐观锁定的 JPA 版本字段的最佳类型

乐观锁定:使用其他资源修改资源

使用 JPA / Hibernate 在无状态应用程序中进行乐观锁定

如何使用StampedLock乐观锁定?(我无法理解来自java doc的代码示例)