「sp_reset_connection」を発行して、SQLプロファイラの意味を理解しようとしています。
次の「exec sp_reset_connection」行の後にBatchStartingとCompletedがあります。
RPC:Completed exec sp_reset_connection
SQL:BatchStarting SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c]
SQL:BatchCompleted SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c]
基本的に、最初の行「exec sp_reset_connection」はプロセス全体(接続が開かれ、選択されたstmtが実行され、接続が閉じられてプールに戻される)が行われることを意味しますか?または、私の接続はまだオープンステージです。
そして、なぜ私自身のselect文の前にsp_reset_connectionが実行されるのですか、それはユーザーのSQLの後にリセットされるべきではないのですか?
接続が開かれたときと閉じられたときをより詳細に知る方法はありますか?
「exec sp_reset_connection」が表示されるということは、接続が閉じられているということですか?
他の回答と同様に、sp_reset_connection
は接続プールが再利用されていることを示します。 1つの特定の結果に注意してください!
sp_reset_connectionは、トランザクション分離レベルを以前の接続の設定からサーバーのデフォルトにリセットしません。
UPDATE:SQL 2014以降、TDSバージョン7.3以降のクライアントドライバーの場合、トランザクション分離レベルはデフォルトにリセットされます。
ref: SQL Server:プールされた接続での分離レベルのリーク
追加情報を次に示します。
ODBC、OLE-DB、System.Data.SqlClientなどのデータアクセスAPIのレイヤーはすべて、接続プールからの接続を再利用するときに(内部)ストアドプロシージャsp_reset_connectionを呼び出します。再接続する前に接続の状態をリセットするためにこれを行いますが、リセットされる内容についてはどこにも文書化されていません。この記事では、接続のリセットされる部分を文書化しようとします。
sp_reset_connectionは、接続の次の側面をリセットします。
すべてのエラー状態と番号(@@ errorなど)
並列クエリを実行する親ECの子スレッドであるすべてのEC(実行コンテキスト)を停止します
未処理の未処理のI/O操作を待機します
接続によってサーバー上の保持されているバッファを解放します
接続で使用されているバッファリソースのロックを解除します
接続が所有するすべての割り当て済みメモリを解放します
接続によって作成された作業テーブルまたは一時テーブルをクリアします
接続が所有するすべてのグローバルカーソルを強制終了します。
開いているSQL-XMLハンドルをすべて閉じます
開いているSQL-XML関連の作業表を削除します
すべてのシステムテーブルを閉じます
すべてのユーザーテーブルを閉じます
すべての一時オブジェクトを削除します
オープントランザクションを中止します
参加時の分散トランザクションからの障害
共有データベースのロックを解除する現在のデータベースのユーザーの参照カウントをデクリメントします
獲得したロックを解放します
取得したハンドルを解放します
すべてのSETオプションをデフォルト値にリセットします
@@ rowcount値をリセットします
@@ identity値をリセットします
Dbcc traceon()を使用して、セッションレベルのトレースオプションをリセットします。
SQL Server 2005以降でCONTEXT_INFOを
NULL
にリセットします [元の記事の一部ではない]sp_reset_connectionはリセットされません:
セキュリティコンテキスト。接続プールが正確な接続文字列に基づいて接続と一致する理由
アプリケーションロールは元に戻せないため、sp_setapproleを使用して入力されたアプリケーションロール
注:一時的なWebでリストが失われないように、ここにリストを含めています。
接続プーリングが使用されていることを示しています(これは良いことです)。
ただし、注意してください:
ストアドプロシージャまたはトリガーでSET TRANSACTION ISOLATION LEVELを発行すると、オブジェクトが制御を返すと、分離レベルはオブジェクトが呼び出されたときに有効だったレベルにリセットされます。たとえば、バッチでREPEATABLE READを設定し、そのバッチが分離レベルをSERIALIZABLEに設定するストアドプロシージャを呼び出す場合、ストアドプロシージャがバッチに制御を返すと、分離レベルの設定はREPEATABLE READに戻ります。