46

sp_reset_connection 似乎由 SQL Server 连接池调用,以确保从池中重用的连接的大部分设置都被重置。有谁确切地知道它做什么和不做什么?

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

4

2 回答 2

74

当重新使用来自连接池的连接时,数据访问 API 的层(如 ODBC、OLE-DB 和 SqlClient)调用(内部)存储过程 sp_reset_connection。它这样做是为了在重新使用之前重置连接的状态。

似乎没有关于重置什么的官方文档,但这里有一个非官方的列表。

sp_reset_connection 重置连接的以下方面:

  • 它重置所有错误状态和数字(如@@error)
  • 它停止作为执行并行查询的父 EC 的子线程的所有 EC(执行上下文)
  • 它将等待任何未完成的 I/O 操作
  • 它将通过连接释放服务器上任何持有的缓冲区
  • 它将解锁连接使用的任何缓冲区资源
  • 它将释放连接拥有的所有分配的内存
  • 它将清除连接创建的所有工作表或临时表
  • 它将杀死连接拥有的所有全局游标
  • 它将关闭所有打开的 SQL-XML 句柄
  • 它将删除任何打开的 SQL-XML 相关工作表
  • 它将关闭所有系统表
  • 它将关闭所有用户表
  • 它将丢弃所有临时对象
  • 它将中止打开的交易
  • 入伍时它将脱离分布式事务
  • 它将减少当前数据库中用户的引用计数;释放共享数据库锁
  • 它将释放获得的锁
  • 它将释放任何可能已获取的句柄
  • 它将所有 SET 选项重置为默认值
  • 它将重置@@rowcount 值
  • 它将重置@@identity 值
  • 它将使用 dbcc traceon() 重置任何会话级别的跟踪选项

sp_reset_connection 不会重置:

  • 安全上下文,这就是连接池根据确切的连接字符串匹配连接的原因
  • 如果您使用 sp_setapprole 输入了应用程序角色,因为应用程序角色无法恢复
  • 事务隔离级别
于 2009-02-27T20:01:31.250 回答
-1

这个论坛帖子

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

于 2009-02-27T20:02:22.713 回答