sp_reset_connection是做什么的?

48

sp_reset_connection似乎是由SQL Server连接池调用的,以确保从池中重用的连接具有大部分重置的设置。不过,有没有人确切知道它做了什么以及未做什么呢?

例如,我从这篇文章中看到,它不会重置事务隔离级别。

2个回答

78

数据访问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 输入了应用程序角色,因为应用程序角色无法还原
  • 事务隔离级别

5
请参阅链接的文章并连接页面 - 这也不会重置任何SET TRANSACTION ISOLATION LEVEL。 - Rory

-1

来自这篇论坛帖子

sp_reset_connection存储过程用于重置连接,以便在池中使用时,不会存储任何特定于连接的先前会话内容。


14
很遗憾,“没有任何东西被保留下来”这种说法是不正确的。事务隔离级别被保留下来,这可能会引发后续问题。在我们的情况下,某些操作使用了可串行化级别(有意为之),但随后将连接释放到池中,导致后续用户也使用可串行化而非读已提交的级别。 - Walden Leverich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接