Что делает sp_reset_connection?

sp_reset_connection, по-видимому, вызывается пулом соединений SQL Server, чтобы убедиться, что соединения, повторно используемые из пула, имеют большинство своих настроек reset. Кто-нибудь знает, что он делает и не делает?

Например, я вижу из этот пост, что он не reset уровень изоляции транзакции

Ответ 1

Уровни API доступа к данным, такие как ODBC, OLE-DB и SqlClient, вызывают (внутреннюю) хранимую процедуру sp_reset_connection при повторном использовании соединения из пула соединений. Это делается для сброса состояния соединения до его повторного использования.

Официальной документации о том, какие вещи сбрасываются, не существует, но вот неофициальный список.

Процедура sp_reset_connection сбрасывает следующие аспекты соединения:

  • Сбрасывает все состояния и числа ошибок (например, @@error)
  • Он останавливает все EC (контексты выполнения), которые являются дочерними потоками родительского EC, выполняющего параллельный запрос
  • Он будет ожидать любых невыполненных операций ввода-вывода
  • Это освободит любые удерживаемые буферы на сервере соединением
  • Это разблокирует любые ресурсы буфера, которые используются соединением
  • Это освободит всю память, выделенную для подключения
  • Он очистит все рабочие или временные таблицы, созданные соединением
  • Это убьет все глобальные курсоры, принадлежащие соединению
  • Он закроет все открытые дескрипторы SQL-XML, которые открыты
  • Он удалит все открытые рабочие таблицы, связанные с SQL-XML
  • Это закроет все системные таблицы
  • Это закроет все пользовательские таблицы
  • Это отбросит все временные объекты
  • Это прервет открытые транзакции
  • Это будет дефект от распределенной транзакции при зачислении
  • Это уменьшит количество ссылок для пользователей в текущей базе данных; который снимает общую блокировку базы данных
  • Это освободит приобретенные замки
  • Это освободит любые ручки, которые могли быть приобретены
  • Все параметры SET будут сброшены до значений по умолчанию
  • Это сбросит значение @@rowcount
  • Это сбросит значение @@идентичности
  • Он сбросит все параметры трассировки на уровне сеанса, используя dbcc traceon()

sp_reset_connection НЕ сбрасывается:

  • Контекст безопасности, поэтому пул соединений сопоставляет соединения на основе точной строки соединения
  • Если вы ввели роль приложения, используя sp_setapprole, так как роли приложения не могут быть восстановлены
  • Уровень изоляции транзакции

Ответ 2

От этот пост форума:

Хранимая процедура sp_reset_connection используется для reset соединения так что, когда он используется в пуле, ничего из предыдущего сеанса не сохраняется что связано с подключением.