4
トランザクションが失敗したSTMの内部にいて、通常の制御フロー(STM衝突などなし)の一部として再試行した場合、是正措置を講じる方法以外の人に指示することができます。STMと発信IO
純粋に「発信」の場合、私のSTMは引き続き純粋に再生できます。
どうすればよいですか発信 IOがSTMから再試行されましたか?
誰かがこれに遭遇しましたか?これはどれほど悪いのでしょうか?
トランザクションが失敗したSTMの内部にいて、通常の制御フロー(STM衝突などなし)の一部として再試行した場合、是正措置を講じる方法以外の人に指示することができます。STMと発信IO
純粋に「発信」の場合、私のSTMは引き続き純粋に再生できます。
どうすればよいですか発信 IOがSTMから再試行されましたか?
誰かがこれに遭遇しましたか?これはどれほど悪いのでしょうか?
実行されたIOがSTMのインバリアントに影響しないことが確かであれば、 unsafeIOToSTM
を使用できます。すべてのunsafe
のように、細心の注意を払って使用してください。
本当に必要かどうか疑問に思っています。この質問からは分かりません。できれば、それを避けるべきです。
私は自分のサーバーでSTMを実行していますが、なぜトランザクションが失敗したかについてのテキストを(ユーザーのUIにメッセージを投稿して)表示したいので、フォームの提出を修正して、再びTVar。 – nicolas
@nicolas ['orElse'](https://hackage.haskell.org/package/stm-2.4.4.1/docs/Control-Monad-STM.html#v:orElse)を使用して、成功/失敗のコードを返します。 'atomically $(myPossiblyFailingSTMAction >> Return True)' orElse'(Falseを返します) ''。 'False'を取得した場合、' myPossiblyFailingSTMAction'は失敗しました。 'unsafeIOToSTM'よりもきれいです –
@nicolas Benjamin Hodgsonが示唆するように、この場合、トランザクションは成功するはずですが、失敗の結果が返されます。 – chi