哪些数据库操作既是“幂等的”又是“可交换的”?

5
我在研究Scala数据库框架/包装器时,发现了Twitter的Gizzard。起初我对它印象深刻,但当我看到限制时就冷静下来了。他们说,您进行的所有DB操作都必须既具有幂等性具有可交换性。如果我理解正确,这基本上几乎什么也剩不下了。例如,如果我有一个带有整数计数器的实体,并且必须递增。我可以使用“递增”操作或“设置”操作。但递增将不是幂等的(如果您运行两次,则与运行一次不同),而设置将不是可交换的(首先设置5,然后2会产生与首先设置2,然后5不同的结果)。那么除了“插入-如果不存在”之外还剩下什么,对于大多数用例而言并不是非常有用。一个分布式数据库框架的意义何在,它如此受限以至于您基本上无法做任何有用的事情?我肯定错过了重要的东西。

【编辑】除了“插入-如果不存在”(和“删除-如果存在”)之外,我认为“比较时间戳和设置”将既具有幂等性又具有可交换性,如果更改排队而不是被丢弃,当“之前的更改”仍然缺失时。但我不知道是否有任何数据库实现了这一点。

2个回答

6

通常,幂等操作在执行前必须检查状态。当应用于数据库更新的上下文中时,这意味着在更新之前检查即将更改的数据的状态。例如:

update some_table set
some_column = 'some_new_value'
where id = 123
and some_column = 'its_current_value'; -- idempotent check

如果这个被运行两次,第二次调用不会有任何操作。
为了满足可交换性,这两个更新需要影响数据状态的不同方面(不同的列/行)。也就是说,每个幂等检查的有效性不能受到其他命令的更新操作的影响。

因此,您可以通过检查旧状态是否具有预期值来更新列,但是您不能将其更新两次,因为如果更新以错误的顺序到达,则两者都将被丢弃。因此,只有在两个更新之间有足够的时间,以确保它们按正确的顺序到达时,才能正常工作。 - Sebastien Diot

3

可交换的操作就是指可以使值单调增长的操作。以下是可幂等操作的示例:

  • 将元素插入到集合中,
  • 将值设置为数值和其先前值中的最大值,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接