TransactionScopeでnpgsqlを使用できると誰かが言うことができますか?
ここのマニュアルで例として提供されているコード: http://npgsql.projects.postgresql.org/docs/manual/UserManual.htmlは機能しません。サーバー上に 2 つの準備済みトランザクションを作成するだけです。
この質問と同じ問題があります: TransactionScope and Npgsql - Prepared Transaction Issue
TransactionScopeでnpgsqlを使用するための解決策はありますか?
UPD: まず第一に、私のターゲット: ソフトウェアで単一の論理トランザクションで 2 つの接続を使用する必要があります。これに対する最適なソリューションは、TransactionScope です。Npgsql は、システム トランザクションでの参加のサポートを宣言します。
次に、問題が発生します。ドキュメントのコードを使用します。このコードは次のことを行います。
- トランザクション スコープの作成
- 最初の接続を開く
- 2 番目の接続を開く
- 最初の接続に挿入する
- 2 番目の接続に挿入する
- 2 番目の接続を閉じる
- 最初の接続を閉じる
- scope.Complete() を呼び出す
- スコープを破棄
9 ステップ後にデータが完全に db にコミットされるのを待ちます。実際、ステップ 6 と 7 で npgsql は準備済みトランザクションを作成し、ステップ 9 では何もしません。最後に、データベースをブロックする 2 つの準備済みトランザクションがあります。そして、それらをコミットまたはロールバックする人は誰もいません。
一般に、スコープで呼び出しが完了する前に接続を閉じると(たとえば、例外のため)、npgsqlはテーブルをブロックする準備済みトランザクションを作成します。正しくない行為だと思います。スコープ破棄後、データが完全にコミットまたは完全にロールバックされるのを待ちます。準備されたトランザクションなし。
ドキュメントのコードでこのバグを繰り返すことができます。参考までに、Devart フリー ライブラリは正しく動作します。