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

时间:2018-03-01 17:13:03

标签: amazon-dynamodb optimistic-locking

dynamodb的save API提供多个save-behaviors,包括public class X { public void print() { System.out.println("X"); } public static void main(String[] args) { X foo = new A(); foo.print(); // X Y bar = new A(); bar.print(); // X } } class Y extends X { } class A extends Y { } UPDATEUPDATE_SKIP_NULL_ATTRIBUTESCLOBBER

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

    1. 其他保存行为怎么样?将UPDATE_SKIP_NULL_ATTRIBUTESAPPEND_SET与版本属性一起使用是否有意义?原因是,您可以在调用save()时跳过版本属性,这有点难以消化。
    2. UPDATE_SKIP_NULL_ATTRIBUTES实际上非常强大。它使您只能对项目应用部分更新。假设您有一个复杂的项目,它存储系统的多个组件的状态,所有这些都在同一记录中。当其中一个组件发生状态更改时,您可以简单地使用UPDATE_SKIP_NULL_ATTRIBUTES应用更新,而不必担心意外修改其他属性。

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

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

      之类的内容更有意义吗?

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