DynamoDB save()API:乐观锁定和SaveBehavior
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DynamoDB save()API:乐观锁定和SaveBehavior相关的知识,希望对你有一定的参考价值。
dynamodb的save API提供了多个save-behaviors,包括UPDATE
,UPDATE_SKIP_NULL_ATTRIBUTES
,CLOBBER
和APPEND_SET
。
根据这个doc,如果保存行为是UPDATE
,则启用Optimistic Locking via version属性,如果它是CLOBBER
则禁用。关于这个的两个问题:
- 为什么有人想禁用乐观锁定?乐观锁定可以让您安全地写入您的记录!
- 其他保存行为怎么样?将
UPDATE_SKIP_NULL_ATTRIBUTES
和APPEND_SET
与版本属性一起使用是否有意义?原因是,您可以在调用save()时跳过version属性,这有点难以消化。
我会尝试回答你的每个问题:
- 为什么有人想禁用乐观锁定?乐观锁定可以让您安全地写入您的记录!
True - 乐观并发使您可以安全地访问您的记录,但它不是免费的(*),您必须决定更新失败时该怎么做。另一方面,如果表的结构使得不可能进行并发更新(例如,您有一个表只能写一次项,每个都有一个唯一键,那么为什么要花费额外的乐观锁的成本?)
(*)具有乐观并发性的UPDATE
要求您首先读取记录,然后尝试更新它,提供您刚读取的版本,这意味着它更昂贵(您必须为读取和写入付费,可能是多个如果存在争用则读取和写入并且需要更长时间(再次,您必须阅读并且之后才能尝试更新)。如果您有另一种方法来确保只有一个编写器可以更新记录,则无需使用乐观并发。
- 其他保存行为怎么样?将
UPDATE_SKIP_NULL_ATTRIBUTES
和APPEND_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的主要内容,如果未能解决你的问题,请参考以下文章