【问题标题】:What does "exec sp_reset_connection" mean in Sql Server Profiler? [duplicate]Sql Server Profiler 中的“exec sp_reset_connection”是什么意思? [复制]
【发布时间】:2010-10-13 01:42:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    就像其他答案所说,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 相关工作表

    • 关闭所有系统表

    • 关闭所有用户表

    • 删除所有临时对象

    • 中止打开的事务

    • 征募时分布式事务的缺陷

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

    • 释放获取的锁

    • 释放所有获取的句柄

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

    • 重置@@rowcount 值

    • 重置@@identity 值

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

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

    sp_reset_connection 不会重置:

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

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

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

    【讨论】:

    • 很好地考虑在此处包含基本信息。您的第二个链接现已失效。
    • 它还会导致审核登录/审核注销事件,该事件将显示在 SQL Server Profiler 中,并将触发相关的触发事件。看起来客户端断开连接并重新连接,但实际上并没有。这让我追了一段时间,所以虽然我现在让人们
    • 它会重置我放入 CONTEXT_INFO 的内容吗?
    • @RobertNiestroj 早期版本(肯定是 SQL Server 2000)没有重置 CONTEXT_INFO。这导致我们在处理任何连接以手动清除CONTEXT_INFO 之前必须执行特定步骤。我最近注意到,至少 SQL Server 2008 R2 修复了这个错误; CONTEXT_INFO自动清除。
    • @IanBoyd 我刚刚使用 SQL Server 2005 SP3 进行了测试,它确实将 CONTEXT_INFO 重置为 NULL。我将使用该详细信息更新答案。值得一提的是,我确实确认TRANSACTION ISOLATION LEVEL没有重置。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      但是请注意:

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

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

      【讨论】:

      • 但是如果你在客户端做同样的事情,使用客户端方法,它不会重置......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多