3
我真的很喜歡的STM,但我希望能得到關於如何正確使用交易的一些建議,特別是當交易的一個塊依賴於另一個使用嵌套的dosync塊有什麼好的編程原則?
,比如我有一些代碼:
(defn unschedule-task [tt task-id] (dosync (doseq [entry .....] (tk/kill-all! (:task entry))) (v/delete! tt [[:task :id] task-id]))) (defn schedule-task [tt task schedule & [enabled? optt]] (dosync (unschedule-task tt (:id task)) (v/insert! tt {.....})))
基本上, unschedule-task
有dosync
塊,並schedule-task
在自己dosync
塊調用unschedule-task
,因爲它需要雙方的缺失和在一個事務要經過插入。
能走多遠一個按這個,什麼是需要避免的陷阱? (我想可能有循環依賴的問題,但不能想到一個例子關閉我的頭頂....)
我相信這個答案會有幫助。 http://stackoverflow.com/questions/2841750/how-do-nested-dosync-calls-behave – mobyte
結束帶有感嘆號的函數名稱用於指示由於重試而在STM事務中使用它可能不安全,例如'swap!'。 –
感謝您的建議!我花了大約半天時間從我的代碼中刪除感嘆號。我們在哪裏可以找到這樣的其他約定? – zcaudate