System.Transaction.TransactionScopeを使用して、いくつかのストアドプロシージャを呼び出すトランザクションを作成しようとしていますが、それ自体がクリーンアップされていないようです。トランザクションが終了すると(コミットされているかどうかに関係なく、トランザクションスコープオブジェクトが破棄されると)、データベースへの後続の接続は、通常のように読み取りコミットではなく、シリアル化可能な読み取りコミットレベルで開きます。
呼び出しごとに接続を開いたり閉じたりします(.NETの通常のように接続のプールを閉じて戻る)、トランザクションでの使用が終了したときに接続を明示的にリセットする方法がありませんか?System.Transaction.TransactionScopeの背後にある考え方は、すべての複雑さを隠すことだと思いました。
したがって、私が持っているコードは次のようになります。
using (var scope = new TransactionScope())
{
... make my 3 stored procedure calls ...
scope.Complete();
return returnCode;
}
これが通常の方法だと思います。しかし、sqlserverプロファイラーを見ると、接続が開かれていることがわかります。
set transaction isolation level serializable
これは、後続の非トランザクション関連のデータベースアクティビティを台無しにしており、明らかにそれほど高速ではありません。ReadCommitedを使用してトランザクションを明示的に実行するようにトランザクションオプションを設定することでこれを回避できますが、これは私の意見ではこの操作の理想的な動作ではありません。
また、Commitabletransactionオブジェクトを明示的に作成し、アンビエントトランザクションを使用する代わりに、明示的な新しいトランザクションを作成しようとしましたが、それでも運がありません。
これを修正する方法についてのアイデアは、シリアル化可能な接続を使用する呼び出しがreadpastロックヒントを使用しようとするとエラーをスローするため、非常に高く評価されます。