2011-08-15 26 views
5

我正在研究Scala數據庫框架/包裝,並在Twitter上遇到了Gizzard。雖然我一開始印象深刻,但當我讀到限制時,我冷靜下來。他們說你所做的所有數據庫操作必須是冪等性的交換。如果我理解正確,基本上幾乎沒有遺漏。作爲一個例子,如果我有一個整數計數器的實體,它必須增加。我可以使用「增量」操作或「設置」操作。但增量不會是冪等的(如果你運行它兩次,你會得到一個不同的結果,然後運行一次),並設置不會交換(設置前5,然後2給出不同的結果,然後設置前兩個,然後5)。那麼,「插入 - 如果不存在」還有什麼不同,對於大多數使用情況來說這不是很有用。分佈式數據庫框架的特點是什麼,它如此受到限制,基本上不能對它做任何有用的事情?我必須錯過重要的事情。除了「insert-if-absent」(和「delete-if-present」)之外,我認爲「compare-timestamp-and-set」將是冪等和交換的,如果更改是排隊而不是丟棄,當「以前的變化」仍然缺失。但我不知道是否有任何數據庫實現這一點。什麼樣的數據庫操作同時是「冪等和可交換」的?

回答

3

交換操作只是導致值單調增長的操作。冪等例子說操作是:

  • 插接件爲一組,
  • 設置的值是最大的一個數字,它以前的價值,
6

通常,冪等動作必須在動作之前檢查狀態。當應用於數據庫更新的上下文時,這意味着在更新之前檢查要更改的數據的狀態。例如:

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

如果這是兩次運行,第二次調用將什麼也不做。

爲了可交換,兩個更新將需要影響數據狀態的不同方面(不同的列/行)。也就是說,每個冪等檢查的有效性都不能受其他命令的更新操作的影響。

+0

所以,你可以更新一列,通過檢查舊狀態是否具有期望值,但不能兩次更新它,因爲如果更新以錯誤的順序到達,它們都將被丟棄。因此,只有在兩次更新之間有足夠的時間才能正常工作,以確保它們以正確的順序到達。 –

相關問題