178

「sp_reset_connection」を発行して、Sql Profiler が何を意味するのかを理解しようとしています。

次の「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が実行され、接続が閉じられ、プールに解放される)が行われることを意味しますか? または、私の接続はまだオープン段階にあります。

そして、sp_reset_connection が自分の select ステートメントの前に実行されるのはなぜですか? リセットはユーザーの sql の後に来るべきではありませんか?

接続がいつ開かれ、いつ閉じられるかをより詳細に知る方法はありますか?

「exec sp_reset_connection」と表示されているということは、接続が閉じられているということですか?

4

3 に答える 3

209

他の回答が言ったように、sp_reset_connection接続プールが再利用されていることを示します。1 つの特定の結果に注意してください。

Jimmy Mays の MSDN ブログは次のように述べています。

sp_reset_connection は、トランザクション分離レベルを以前の接続の設定からサーバーの既定値にリセットしません。

更新: SQL 2014 以降、TDS バージョン 7.3 以降のクライアント ドライバーの場合、トランザクション分離レベルは既定値にリセットされます。

ref: SQL Server: プールされた接続間で分離レベルがリークする

追加情報を次に示します。

sp_reset_connection は何をしますか?

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() を使用して、セッション レベルのトレース オプションをリセットします。

  • CONTEXT_INFO をNULLSQL Server 2005 以降にリセットします[元の記事の一部ではありません]

sp_reset_connection はリセットされません:

  • セキュリティ コンテキスト。これが、接続プーリングが正確な接続文字列に基づいて接続を照合する理由です。

  • アプリケーション ロールはsp_setapproleを使用して入力されました。これは、SQL Server 2005 より前のバージョンではアプリケーション ロールを元に戻すことができなかったためです。接続を閉じる前に、実行時に取得される「Cookie」値を使用して、sp_unsetapproleを介してアプリケーション ロールを手動で元に戻す必要がありますsp_setapprole

注: 一時的な Web の中で失われたくないので、ここにリストを含めます。

于 2010-05-27T20:01:31.807 に答える
22

これは、接続プーリングが使用されていることを示しています (これは良いことです)。

于 2009-03-13T01:32:38.180 に答える
10

ただし、次の点に注意してください。

ストアド プロシージャまたはトリガーで SET TRANSACTION ISOLATION LEVEL を発行した場合、オブジェクトが制御を返すと、分離レベルは、オブジェクトが呼び出されたときに有効だったレベルにリセットされます。たとえば、バッチで REPEATABLE READ を設定し、バッチが分離レベルを SERIALIZABLE に設定するストアド プロシージャを呼び出した場合、ストアド プロシージャが制御をバッチに返すと、分離レベルの設定は REPEATABLE READ に戻ります。

http://msdn.microsoft.com/en-us/library/ms173763.aspx

于 2011-08-03T10:01:08.890 に答える