何かをデバッグしようとすると、次のことを効果的に実行しているコードが見つかりました。
- トランザクション スコープの作成
- トランザクションの作成 (この場合は nHibernate tx ですが、あまり重要ではありません)
- 2 番目のトランザクション (この場合は標準の ADO.Net Tx) の作成
- 2 番目のトランザクションのコミット
- Transaction スコープで Complete() を呼び出す
- トランザクション スコープの破棄。
現在 - トランザクションを作成してコミットしないというのは、おそらくとにかく悪い考えです。
ただし、これをテストするとき-上記のさまざまな組み合わせを試しました(すべてのトランザクションをコミットする、いくつかのトランザクションをコミットする、トランザクションなし(つまりTScopeのみ)、最初をコミットするが2番目はコミットしない、他のトランザクションを追加するなど)すべてのテストで、次のことがわかりました本当だ:
最初のトランザクションのコミットに失敗し、トランザクション スコープが分散された場合にのみ、TScope の Dispose は次のエラーで失敗します。
System.InvalidOperationException : 操作は、登録の現在の状態に対して有効ではありません。
私は今興味があり、なぜこれが事実なのか知りたいですか?