我正在编写一个使用STM的Clojure程序。目前,我正在从数据库中启动populating STM(使用refs),然后在每次dosync事务成功时异步更新数据库。但是,我不知道这样做是否正确,或者是否有更好的标准技术来完成这项任务。有人可以解释一下如何将STM的ACI属性转换为Clojure程序中的ACID吗?
(def db-agent (agent dummy-value))
(defn db-write [_ data] ;; make this intelligent to handle when db is not up
(try
(write-to-db data)
(catch ... database fails, do a retry or let user know of problem))
_)
;; in the transaction code
(dosync
(alter my-ref ...)
(send-off db-agent db-write @my-ref)) ;; ensure db gets written to
阅读Alyssa Kwan修改的Clojure核心库,该库增加了对refs的持久性支持,请参见:ANN: Durable refs with ACID guarantees - Phase I, ANN: Durable Clojure - Phase II - Persistent Data Structures, ANN: Durable Clojure - Functions and Closures
使用Sergey Didenko的库,该库不能提供强大的持久性保证,但非常接近于此:Simple-Persistence-for-Clojure
其他方法可能对程序员不太透明。
STM模型非常适合跟踪多个系统的访问,因为它们发生变化。但是,它不太适用于数据持久性,因为这些更改需要在访问它们的线程的生命周期之外进行访问。
通常最好将ACID中的'D'与STM分开考虑。