假设以下代码中的 ref 在其他事务以及下面的事务中被修改,我担心这个事务将一直运行到提交时,提交失败,然后重新运行事务。
(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,并返回(成功提交)
- 长时间运行的计算一直持续到完成
- 事务 A 尝试提交但失败,因为 my-ref 已被修改
- 使用 my-ref 的新值重新启动事务(称为 A')并退出,因为 some-prop 不正确
这就是我想要发生的事情,也许这就是发生的事情(我只是不知道,所以我在问这个问题:-)
当事务 B 提交 my-ref 时,我希望事务 A 立即停止(因为 my-ref 的值已更改)并使用新值重新启动。是这样吗?
我想要这种行为的原因是长时间运行计算不会将所有 CPU 时间浪费在现在已经过时的计算上。
我考虑过使用ensure
,但我不确定如何在这种情况下使用它或者是否有必要。