“exec sp_reset_connection”在Sql Server Profiler中的含义是什么?

时间:2009-03-13 01:07:35

标签: sql-server database-connection sqlprofiler sp-reset-connection

尝试通过发出“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”,这是否意味着我的连接已关闭?

3 个答案:

答案 0 :(得分:186)

与其他答案一样,sp_reset_connection表示正在重用连接池。注意一个特定的后果!

  

Jimmy Mays' MSDN Blog 说:

     

sp_reset_connection不会重置   事务隔离级别到   服务器默认来自上一个   连接的设置。

更新:从SQL 2014开始,对于TDS 7.3或更高版本的客户端驱动程序,事务隔离级别将重置为默认值。

参考:SQL Server: Isolation level leaks across pooled connections

以下是一些其他信息:

  

<强> What does sp_reset_connection do?

     

数据访问API的层,如ODBC,   OLE-DB和System.Data.SqlClient全部   调用(内部)存储过程   重新使用时的sp_reset_connection   来自连接池的连接。它   这样做是为了重置状态   连接重新使用之前,   然而,没有任何记录是什么   事情变得复活了。本文尝试   记录部分内容   重置的连接。

     

sp_reset_connection重置   以下几个方面的连接:

     
      
  • 所有错误状态和数字   (如@@ error)

  •   
  • 停止所有EC(执行上下文)   这是父母EC的子线程   执行并行查询

  •   
  • 等待任何未完成的I / O.   卓越的运作

  •   
  • 释放任何保留的缓冲区   服务器连接

  •   
  • 解锁所有缓冲资源   连接使用的

  •   
  • 释放所有已分配的内存   由连接拥有

  •   
  • 清除任何工作或临时工作   由...创建的表   连接

  •   
  • 杀死所拥有的所有全局游标   连接

  •   
  • 关闭所有打开的

  • 打开的SQL-XML句柄   
  • 删除所有与SQL-XML相关的开放工作表

  •   
  • 关闭所有系统表

  •   
  • 关闭所有用户表

  •   
  • 删除所有临时对象

  •   
  • 中止未结交易

  •   
  • 入伍时来自分布式交易的缺陷

  •   
  • 减少引用计数   对于当前数据库中的用户   发布共享数据库锁

  •   
  • Frees获得了锁

  •   
  • 发布所有获得的句柄

  •   
  • 将所有SET选项重置为默认值

  •   
  • 重置@@ rowcount值

  •   
  • 重置@@ identity值

  •   
  • 重置任何会话级别跟踪   使用dbcc traceon()

  • 的选项   
  • 将SQL Server 2005中的CONTEXT_INFO重置为NULL,更新 [不是原始文章的一部分]

  •   
     

sp_reset_connection不会重置:

     
      
  • 安全上下文,这就是原因   连接池匹配连接   基于确切的连接字符串

  •   
  • 输入了应用程序角色   使用sp_setapprole,因为应用程序   角色无法还原

  •   

注意:我在此处列出了这个列表,因为我不希望它在瞬态网络中丢失。

答案 1 :(得分:20)

这表明正在使用连接池(这是一件好事)。

答案 2 :(得分:9)

但请注意:

如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别。例如,如果批量设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ。

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