2012-11-19 14 views
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-taskdosync塊,並schedule-task在自己dosync塊調用unschedule-task,因爲它需要雙方的缺失和在一個事務要經過插入。

能走多遠一個按這個,什麼是需要避免的陷阱? (我想可能有循環依賴的問題,但不能想到一個例子關閉我的頭頂....)

+0

我相信這個答案會有幫助。 http://stackoverflow.com/questions/2841750/how-do-nested-dosync-calls-behave – mobyte

+0

結束帶有感嘆號的函數名稱用於指示由於重試而在STM事務中使用它可能不安全,例如'swap!'。 –

+0

感謝您的建議!我花了大約半天時間從我的代碼中刪除感嘆號。我們在哪裏可以找到這樣的其他約定? – zcaudate

回答

1

交易平淡;在交易期間開始新交易不會執行任何操作。 IOW,或者在外部交易期間所有的修改都會成功,或者整個外部交易重新啓動。這意味着應該沒有依賴性問題。

相關問題