尝试通过发出“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”,这是否意味着我的连接已关闭?
答案 0 :(得分:186)
与其他答案一样,sp_reset_connection
表示正在重用连接池。注意一个特定的后果!
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相关的开放工作表
关闭所有系统表
关闭所有用户表
删除所有临时对象
中止未结交易
入伍时来自分布式交易的缺陷
减少引用计数 对于当前数据库中的用户 发布共享数据库锁
Frees获得了锁
发布所有获得的句柄
将所有SET选项重置为默认值
重置@@ rowcount值
重置@@ identity值
- 的选项
重置任何会话级别跟踪 使用dbcc traceon()
将SQL Server 2005中的CONTEXT_INFO重置为
NULL
,更新 [不是原始文章的一部分]sp_reset_connection不会重置:
安全上下文,这就是原因 连接池匹配连接 基于确切的连接字符串
输入了应用程序角色 使用sp_setapprole,因为应用程序 角色无法还原
注意:我在此处列出了这个列表,因为我不希望它在瞬态网络中丢失。
答案 1 :(得分:20)
这表明正在使用连接池(这是一件好事)。
答案 2 :(得分:9)
但请注意:
如果在存储过程或触发器中发出SET TRANSACTION ISOLATION LEVEL,则当对象返回控件时,隔离级别将重置为调用对象时生效的级别。例如,如果批量设置REPEATABLE READ,然后批处理调用将隔离级别设置为SERIALIZABLE的存储过程,则当存储过程将控制权返回给批处理时,隔离级别设置将恢复为REPEATABLE READ。