当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《"execsp_reset_connection"在SqlServerProfiler中的含义是什么?》经验,为你挑选了3个好方法。

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



1> ram..:

与其他答案一样,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输入的应用程序角色,因为无法还原应用程序角色

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


在这里包含基本信息的良好思考.你的第二个链接已经死了.
它还会导致审核登录/审核注销事件(将在SQL Server Profiler中显示),并将触发相关的触发事件.它看起来像客户端断开连接并重新连接,而它实际上没有.这让我追了一会儿我的尾巴,所以虽然我现在让人们
@RobertNiestroj早期版本(肯定是SQL Server 2000)确实**不**重置`CONTEXT_INFO`.在我们处理任何连接以手动清除`CONTEXT_INFO`之前,这导致我们必须执行特定步骤.我最近注意到,至少SQL Server 2008 R2修复了这个bug; `CONTEXT_INFO`**自动清除**.

2> Mitch Wheat..:

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



3> 小智..:

但请注意:

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

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


但如果您在客户端使用客户端方法执行相同操作,则不会重置...
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有