sp_reset_connection似乎是由SQL Server连接池调用的,以确保从池中重用的连接具有大部分重置的设置。不过,有没有人确切知道它做了什么以及未做什么呢?
例如,我从这篇文章中看到,它不会重置事务隔离级别。
sp_reset_connection似乎是由SQL Server连接池调用的,以确保从池中重用的连接具有大部分重置的设置。不过,有没有人确切知道它做了什么以及未做什么呢?
例如,我从这篇文章中看到,它不会重置事务隔离级别。
数据访问API层(例如ODBC、OLE-DB和SqlClient)从连接池中重用连接时,会调用(内部)存储过程sp_reset_connection。它这样做是为了在重新使用之前重置连接的状态。
没有官方文档说明会被重置哪些内容,但以下是非官方列表。
sp_reset_connection会重置连接的以下方面:
- 重置所有错误状态和编号(如@@error)
- 停止执行并行查询的父执行上下文的所有子线程的EC(执行上下文)
- 等待任何未完成的I/O操作
- 释放连接在服务器上持有的任何缓冲区
- 解锁连接使用的任何缓冲区资源
- 释放连接拥有的所有分配的内存
- 清除连接创建的任何工作或临时表
- 关闭连接拥有的所有全局游标
- 关闭所有打开的SQL-XML句柄
- 删除所有打开的SQL-XML相关工作表
- 关闭所有系统表
- 关闭所有用户表
- 删除所有临时对象
- 中止打开的事务
- 在注册时从分布式事务中退出
- 减少当前数据库中用户的引用计数;以释放共享数据库锁
- 释放已获得的所有锁定
- 释放可能已获取的任何句柄
- 将所有SET选项重置为默认值
- 重置@@rowcount值
- 重置@@identity值
- 使用dbcc traceon()重置任何会话级跟踪选项
sp_reset_connection 不会重置以下内容:
- 安全上下文,这就是为什么连接池根据完全相同的连接字符串匹配连接的原因
- 如果使用 sp_setapprole 输入了应用程序角色,因为应用程序角色无法还原
- 事务隔离级别
来自这篇论坛帖子:
sp_reset_connection存储过程用于重置连接,以便在池中使用时,不会存储任何特定于连接的先前会话内容。