13

如何在 Clojure 中查看我的 STM 中的回滚次数?

4

3 回答 3

18

你不能……除非你愿意作弊:

(defmacro spy-dosync [& body]
  `(let [retries# (atom -1)
         result# (dosync
                   (swap! retries# inc)
                   ~@body)]
     (println "retries count:" @retries#)
     result#))

然后用 spy-dosync 替换你的 dosync。

于 2011-01-25T11:16:19.287 回答
5

如果你感觉很活泼,你可以破解 Clojure 源代码并重建(重建 Clojure 源代码很容易)。事务重试发生在 src/jvm/clojure/lang/LockingTransaction.java 的 run() 方法中。那里有一个很大的 for 循环,直到完成或 RETRY_LIMIT。循环退出时 i 的值应该是重试次数。

于 2011-01-25T15:02:04.827 回答
2

Chris Houser 编写的STM 压力测试可能很有用

于 2011-01-26T16:21:55.167 回答