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

Ray*_*Ray 166 sql-server database-connection sql-server-profiler 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]    
Run Code Online (Sandbox Code Playgroud)

基本上第一行"exec sp_reset_connection"意味着整个过程(我的连接被打开,选择stmt运行,然后连接关闭并释放回池)刚刚发生?或者我的联系仍处于开放阶段.

而且,为什么sp_reset_connection在我自己的select语句之前执行,不应该在用户的sql之后复位吗?

我想知道有什么方法可以更详细地了解连接何时打开和关闭?

通过查看"exec sp_reset_connection",这是否意味着我的连接已关闭?

ram*_*ram 191

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

Jimmy Mays的MSDN博客说:

sp_reset_connection不会将事务隔离级别从先前连接的设置重置为服务器默认值.

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

ref:SQL Server:池化连接中的隔离级别泄漏

以下是一些其他信息:

sp_reset_connection有什么作用?

当重用连接池中的连接时,数据访问API的层(如ODBC,OLE-DB和System.Data.SqlClient)都会调用(内部)存储过程sp_reset_connection.这样做是为了在重新使用之前重置连接状态,但是没有记录哪些内容被重置.本文试图记录重置的连接部分.

sp_reset_connection重置连接的以下方面:

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

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

  • 等待任何未完成的I/O操作

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

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

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

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

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

  • 关闭所有打开的打开的SQL-XML句柄

  • 删除任何打开的与SQL-XML相关的工作表

  • 关闭所有系统表

  • 关闭所有用户表

  • 删除所有临时对象

  • 中止开放交易

  • 登记时来自分布式事务的缺陷

  • 减少当前数据库中用户的引用计数,该数据库释放共享数据库锁

  • Frees获得了锁

  • 释放任何获得的句柄

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

  • 重置@@ rowcount值

  • 重置@@ identity值

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

  • 将CONTEXT_INFO重置为NULLSQL Server 2005及更新版本[不是原始文章的一部分]

sp_reset_connection不会重置:

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

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

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

  • 在这里包含基本信息的良好思考.你的第二个链接已经死了. (14认同)
  • 它还会导致审核登录/审核注销事件(将在SQL Server Profiler中显示),并将触发相关的触发事件.它看起来像客户端断开连接并重新连接,而它实际上没有.这让我追了一会儿我的尾巴,所以虽然我现在让人们 (13认同)
  • @RobertNiestroj早期版本(肯定是SQL Server 2000)确实**不**重置`CONTEXT_INFO`.在我们处理任何连接以手动清除`CONTEXT_INFO`之前,这导致我们必须执行特定步骤.我最近注意到,至少SQL Server 2008 R2修复了这个bug; `CONTEXT_INFO`**自动清除**. (2认同)
  • @IanBoyd 我刚刚用 SQL Server 2005 SP3 进行了测试,它确实将 `CONTEXT_INFO` 重置为 `NULL`。我会用那个细节更新答案。就其价值而言,我确实确认“交易隔离级别”**未**重置。 (2认同)

Mit*_*eat 21

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


小智 9

但请注意:

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

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

  • 但如果您在客户端使用客户端方法执行相同操作,则不会重置... (4认同)