Как узнать, прерывается ли транзакция?

Я пытаюсь отладить программу, использующую STM. Показания ThreadScope указывают на очень высокую активность процессора, как вы можете видеть здесь:

введите описание изображения здесь

Итак, я пытаюсь выяснить, происходит ли это из-за транзакции, которая часто прерывается. Первое, что я подумал, было использовать что-то вроде этого, чтобы проверить:

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

Но я не уверен, что это правильно или если это лучший подход к отладке в сценарии STM. Любые идеи?

Ответы

Ответ 1

Используйте 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

(Имена транзакций будут сгенерированы автоматически, но есть помощники, чтобы установить свои собственные.)