5

我正在研究 Scala DB 框架/包装器,并从 Twitter 遇到了 Gizzard。起初我印象深刻,但当我读到限制时,我冷静下来。他们说您所做的所有数据库操作都必须是幂等可交换的。如果我理解正确,这基本上几乎没有留下任何东西。例如,如果我有一个带有整数计数器的实体,并且它必须递增。我可以使用“增量”操作或“设置”操作。但是增量不是幂等的(如果你运行它两次,你会得到不同的结果然后运行一次),并且 set 不会是可交换的(先设置 5 然后设置 2 给出不同的结果,然后设置前两个然后设置 5)。那么除了“insert-if-absent”之外还有什么东西,这对于大多数用例来说不是很有用。分布式数据库框架的意义何在,它是如此受限以至于您基本上无法用它做任何有用的事情?我一定错过了一些重要的事情。

[编辑]除了“insert-if-absent”(和“delete-if-present”)之外,我认为“compare-timestamp-and-set”将是幂等和可交换的,如果更改排队而不是被丢弃,当仍然缺少“以前的更改”时。但我不知道是否有任何数据库实现了这一点。

4

2 回答 2

6

一般来说,幂等动作必须在动作之前检查状态。当应用于数据库更新的上下文时,这意味着在更新之前检查将要更改的数据的状态。例如:

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

如果运行两次,第二次调用将什么也不做。

为了可交换,这两个更新需要影响数据状态的不同方面(不同的列/行)。也就是说,每个幂等检查的有效性一定不受其他命令的更新操作的影响。

于 2011-08-15T08:27:36.350 回答
2

交换操作只是导致值单调增长的操作。所述操作的幂等示例是:

  • 将元素插入集合中,
  • 将值设置为数字及其先前值的最大值,
于 2011-10-28T13:33:30.617 回答