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”是否意味着整个过程(我的连接被打开,select stmt运行,然后连接被关闭并释放回池)才发生?或者我的连接仍处于开放阶段。

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

我想知道有没有办法更详细地了解连接何时打开和关闭?

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

4

3 回答 3

209

就像其他答案所说,sp_reset_connection表明连接池正在被重用。注意一个特殊的后果!

Jimmy Mays 的 MSDN 博客说:

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

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

参考:SQL Server:跨池连接的隔离级别泄漏

以下是一些附加信息:

sp_reset_connection 有什么作用?

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

sp_reset_connection 重置连接的以下方面:

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

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

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

  • 通过连接释放服务器上所有持有的缓冲区

  • 解锁连接使用的任何缓冲区资源

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

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

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

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

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

  • 关闭所有系统表

  • 关闭所有用户表

  • 删除所有临时对象

  • 中止未结交易

  • 入伍时分布式事务的缺陷

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

  • 释放获得的锁

  • 释放任何获取的句柄

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

  • 重置@@rowcount 值

  • 重置@@identity 值

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

  • NULL在 SQL Server 2005 和更新版本中将CONTEXT_INFO 重置为[不是原始文章的一部分]

sp_reset_connection 不会重置:

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

  • 使用sp_setapprole输入的应用程序角色,因为在 SQL Server 2005 之前根本无法恢复应用程序角色。从 SQL Server 2005 开始,可以恢复应用程序角色,但只能使用不属于会话的附加信息。在关闭连接之前,需要通过sp_unsetapprole使用sp_setapprole执行时捕获的“cookie”值手动恢复应用程序角色。

注意:我在此处包含列表,因为我不希望它在瞬息万变的网络中丢失。

于 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 回答