トランザクション内で、リファレンスの値の変更に失敗した場合は、トランザクションの最初から処理をリトライする。
トランザクションの処理に時間がかかり、何回繰り返してもリファレンスの値を更新できない場合は Live lock 状態になる。Clojureでは、これを防ぐため、リトライ回数がある一定値を越えると、例外を投げる仕組みになっている。
リトライ回数の最大値はどのくらいかなと、調べてみた。
(def x (ref 0))
(defn test1 []
(dosync
@(future (dosync (alter x inc)))
(ref-set x -1)))
user> (test1)
RuntimeException Transaction failed after reaching retry limit clojure.lang.Util.runtimeException (Util.java:219)
user> x
#<Ref@843d62: 10000>
user>
最大10000回もリトライしていた。
数十回程度かなと思っていたので、少しびっくり。
この値は変更できるのか、ざっと調べてみたが、変更方法は見付からなかった。
Clojure の STM のドキュメントのどこかに書いてあるのかな?
0 件のコメント:
コメントを投稿