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 {
}
,UPDATE
,UPDATE_SKIP_NULL_ATTRIBUTES
和CLOBBER
。
根据此doc如果保存行为为APPEND_SET
,则启用乐观锁定通过版本属性,如果保存行为为UPDATE
则禁用。
关于这个的两个问题:
CLOBBER
和UPDATE_SKIP_NULL_ATTRIBUTES
与版本属性一起使用是否有意义?原因是,您可以在调用save()时跳过版本属性,这有点难以消化。答案 0 :(得分:1)
我会尽力回答你的每一个问题:
True - 乐观并发使您可以安全地访问您的记录,但它不是免费的(*),您必须决定在更新失败时该怎么做。另一方面,如果表的结构使得不可能进行并发更新(例如,您有一个表只能写一次项,每个都有一个唯一键,那么为什么要花费额外的乐观锁的成本?)
(*)具有乐观并发性的UPDATE
要求您首先读取记录,然后尝试更新它,提供您刚刚阅读的版本,这意味着它更昂贵(您必须支付读取和写入,如果存在争用,可能会进行多次读取和写入)并且需要更长时间(再次,您必须阅读,之后才能尝试更新)。如果您有另一种方法可以确保只有一个编写器可以更新记录,则无需使用乐观并发。
UPDATE_SKIP_NULL_ATTRIBUTES
和APPEND_SET
与版本属性一起使用是否有意义?原因是,您可以在调用save()时跳过版本属性,这有点难以消化。 UPDATE_SKIP_NULL_ATTRIBUTES
实际上非常强大。它使您只能对项目应用部分更新。假设您有一个复杂的项目,它存储系统的多个组件的状态,所有这些都在同一记录中。当其中一个组件发生状态更改时,您可以简单地使用UPDATE_SKIP_NULL_ATTRIBUTES
应用更新,而不必担心意外修改其他属性。
APPEND_SET
模式类似于UPDATE_SKIP_NULL_ATTRIBUTES
,但它更改了作为集存储的属性的更新行为,从默认覆盖整个集合以附加到集合。就个人而言,我没有发现它非常有用,但我可以想象它可能有用。
最后一个问题是, 使用UPDATE_SKIP_NULL_ATTRIBUTES
和乐观并发
我认为这取决于您如何构建系统。可以想象有一个表,其中GSI用于生成每个项目的部分,具有键和版本属性。然后,您只能从GSI中读取您需要的内容,然后如果您想应用部分更新,您可以乐观地做到这一点。