如何发现事务是否频繁中止?

How to discover if a transaction is frequently aborting?

我正在尝试调试使用 STM 的程序。 ThreadScope 读数指出非常高的 CPU activity,如您在此处所见:

所以我试图查明发生这种情况是否是由于频繁中止的事务引起的。我想到的第一件事是使用这样的东西来测试:

atomically $ do
  someWork 
  ...
`orElse` do
  unsafeIOToSTM $ traceEventIO "transaction aborted!"
  retry

但我不确定这是否正确,或者这是否是在 STM 场景中进行调试的最佳方法。有什么想法吗?

使用stm-stats包。它提供了 trackSTM,您应该使用它来代替 atomically,而 dumpSTMStats :: IO () 将提供如下内容:

STM transaction statistics (2011-10-09 12:28:37.188951 UTC):
Transaction     Commits    Retries      Ratio
_anonymous_           1          0       0.00
reader                1         23      23.00
writer               23          0       0.00

(交易名称会自动生成,但有帮助者可以自己设置。)