我正在研究Scala数据库框架/包装器,并从Twitter发现了Gizzard。虽然我一开始印象深刻,但在阅读限制时我冷却了。他们说你所做的所有数据库操作都必须是幂等的和交换。如果我理解得当,这基本上几乎没有留下任何东西。例如,如果我有一个带整数计数器的实体,则必须递增。我可以使用“增量”操作,也可以使用“设置”操作。但是增量不是幂等的(如果你运行它两次,你得到一个不同的结果然后运行一次),并且set不会是可交换的(设置前5然后2给出不同的结果然后设置前两个然后设置5)。那么“插入 - 如果缺席”还有什么区别,这对大多数用例来说都不是很有用。分布式数据库框架有何局限性,以至于你基本上无法对它做任何有用的事情?我必须遗漏一些重要的东西。
[编辑]除了“insert-if-absent”(和“delete-if-present”)之外,我认为“compare-timestamp-and-set”既是幂等的又是可交换的,如果改变的话当“之前的更改”仍然缺失时,排队而不是丢弃。但我不知道是否有任何数据库实现了这一点。
答案 0 :(得分:6)
通常,幂等行为必须在行动前检查状态。当应用于数据库更新的上下文时,这意味着在更新之前检查要更改的数据的状态。例如:
update some_table set
some_column = 'some_new_value'
where id = 123
and some_column = 'its_current_value'; -- idempotent check
如果这次运行两次,第二次通话将无效。
要进行交换,这两个更新需要影响数据状态的不同方面(不同的列/行)。也就是说,每个幂等检查的有效性不得受其他命令的更新操作的影响。
答案 1 :(得分:3)
交换操作只是导致价值单调增长的操作。所述操作的幂等示例是: