使用嵌套的dosync块有什么好的编程原则?

时间:2012-11-19 01:21:40

标签: clojure

我真的很喜欢STM,但我希望得到一些关于如何正确使用交易的建议,特别是当一个交易块依赖于另一个时

例如我有一些代码:

(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-taskunschedule-task块中调用dosync,因为它需要删除和插入在一次交易中完成。

可以推动多远,避免哪些陷阱? (我认为可能存在循环依赖的问题,但是我无法想到一个例子......)

1 个答案:

答案 0 :(得分:1)

交易被夷为平地;在交易期间开始新交易不会做任何事情。 IOW,要么在外部事务期间所有ref修改都成功,要么重新启动整个外部事务。这意味着不应该存在依赖性问题。