2011-01-25 17 views

Trả lời

17

Bạn không thể ... trừ khi bạn sẵn sàng để lừa:

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

và sau đó thay thế dosync của bạn bằng một spy-dosync.

5

Nếu bạn cảm thấy khó chịu, bạn có thể hack nguồn Clojure và xây dựng lại (đó là easy để xây dựng lại nguồn Clojure). Việc thử lại giao dịch xảy ra trong src/jvm/clojure/lang/LockingTransaction.java trong phương thức run(). Có một vòng lặp lớn cho đến khi thực hiện hoặc RETRY_LIMIT. Giá trị của i khi thoát vòng lặp phải là số đếm lại.

2

Có STM-stress test được viết bởi Chris Houser có thể hữu ích

Các vấn đề liên quan