次のコードの参照が他のトランザクションと同様に以下のトランザクションで変更されていると仮定すると、私の懸念は、このトランザクションがコミットの時間になるまで実行され、コミットに失敗してからトランザクションを再実行することです。
(defn modify-ref [my-ref]
(dosync (if (some-prop-of-ref-true @my-ref)
(alter my-ref long-running-calculation))))
これが私の恐れの全容です:
- modify-ref が呼び出され、トランザクションが開始され (A と呼びます)、長時間実行計算が開始されます。
- 別のトランザクション (B と呼びます) が開始され、my-ref が変更され、返されます (正常にコミットされます)。
- long-running-calculation は終了するまで継続します
- トランザクション A はコミットを試みますが、my-ref が変更されているため失敗します
- some-prop が true でないため、トランザクションは my-ref の新しい値で再開され (A' と呼びます)、終了します。
これが私が起こりたいことであり、おそらくこれが起こることです(私にはわからないので、質問しています:-)
トランザクション B が my-ref をコミットしたら、トランザクション A をすぐに停止して (my-ref の値が変更されたため)、新しい値で再開したいと考えています。それが起こるのですか?
この動作が必要な理由は、長時間実行計算が、現在は廃止された計算で CPU 時間をすべて浪費しないようにするためです。
を使用することを考えensure
ましたが、このコンテキストでどのように使用するか、または必要かどうかわかりません。