2014-07-16 44 views
1

TL; DR我想要的功能是:「只更新Y,如果Y = 10」,否則失敗。如何使用Datomic數據庫執行原子操作?

例如:想象時間軸是T1,T2和T3。在時刻T1,實體X包含屬性Y = 10,在時間T2該屬性是Y = 14。我的目標是在Y中應用一個複雜的操作(假設這個操作是1的總和)。我在T1讀取Y值爲10,並將此值放入要處理的隊列中。在T3,當複雜的操作完成並且結果是11時,我將更新屬性Y.如果我簡單地更新屬性,那麼在T2的值Y = 14,它將被錯誤地丟棄。然而,在T3,更新後,我想確定最終值是Y = 10,否則我必須在T2處讀取Y = 14進行再處理。

我知道Database Functions用來進行原子讀取 - 修改 - 更新處理,但是如果操作很複雜並且需要分配(放入隊列後),這種方法就不好。

我想要的是相當於DynamoDB中的Conditional Writes的東西。

回答

1

記錄關於馬薩的評論「是插入只有當或拋出異常交易功能」,你能不能只用內置一個see :db.fn/cas

+0

@RodyD,完美無瑕。 –

2

您可以運行確認進程對端,驗證某個基礎T,然後檢查事務中數據庫的基礎T.因此,計算複雜或代價昂貴的代碼被處理爲對等方,交易功能僅負責基礎T驗證。

對於與標準用例相匹配的任何內容(例如,您的示例中的描述),Database Functions是正確和正確的答案。

內置:db.fn/CAS功能可用,現在在http://docs.datomic.com/transactions.html

+0

謝謝你本!我將創建一個事務函數來做到這一點:插入ONLY ,否則拋出異常。它應該解決我的問題。 –

+0

內置的fn做到了這一點::db.fn/cas(來自@RoryD答案) –

+1

我們最近更新了文檔以包含:db.fn/cas內建。我已經更新了我的回答以反映。 –

相關問題