试图通过发出"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",这是否意味着我的连接已关闭?
与其他答案一样,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重置为
NULL
SQL Server 2005及更新版本[不是原始文章的一部分]
sp_reset_connection不会重置:
安全上下文,这就是连接池根据确切的连接字符串匹配连接的原因
使用sp_setapprole输入的应用程序角色,因为无法还原应用程序角色
注意:我在这里列出了这个列表,因为我不希望它在瞬态网络中丢失.
这表明正在使用连接池(这是一件好事).
但请注意:
如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别.例如,如果在批处理中设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ.
http://msdn.microsoft.com/en-us/library/ms173763.aspx