Что означает "exec sp_reset_connection" в Sql Server Profiler?
Попытка понять, что означает Sql Profiler, испуская "sp_reset_connection".
У меня есть следующая строка "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" означает, что весь процесс (мое соединение было открыто, команда select stmt запущена, затем соединение закрыто и возвращено в пул) просто имеет место? Или моя связь все еще находится на открытой сцене.
И почему sp_reset_connection выполняется перед моим собственным оператором select, не должен ли сброс произойти после sql пользователя?
Я пытаюсь узнать, есть ли способ узнать более подробно, когда соединение открывается и закрывается?
Видя "exec sp_reset_connection", означает ли это, что мое соединение закрыто?
3 ответа
Как и в других ответах, sp_reset_connection
указывает, что пул соединений используется повторно. Помните об одном конкретном следствии!
Блог MSDN Джимми Мейса сказал:
Процедура sp_reset_connection НЕ сбрасывает уровень изоляции транзакции до уровня сервера по умолчанию, установленного в предыдущем соединении.
ОБНОВЛЕНИЕ: Начиная с SQL 2014, для клиентских драйверов с TDS версии 7.3 или выше уровни изоляции транзакций будут сброшены до значений по умолчанию.
ref: SQL Server: утечка уровня изоляции через пул соединений
Вот дополнительная информация:
Что делает sp_reset_connection?
Слои API доступа к данным, такие как ODBC, OLE-DB и System.Data.SqlClient, вызывают (внутреннюю) хранимую процедуру sp_reset_connection при повторном использовании соединения из пула соединений. Это делается для сброса состояния соединения до его повторного использования, однако нигде не задокументировано, что происходит сброс. Эта статья пытается задокументировать части соединения, которые получают сброс.
Процедура sp_reset_connection сбрасывает следующие аспекты соединения:
Все состояния и числа ошибок (например, @@error)
Останавливает все EC (контексты выполнения), которые являются дочерними потоками родительского EC, выполняющего параллельный запрос
Ожидает выдающихся операций ввода-вывода
Освобождает любые удерживаемые буферы на сервере посредством соединения
Разблокирует любые ресурсы буфера, которые используются соединением
Освобождает всю выделенную память, принадлежащую соединению
Очищает любые рабочие или временные таблицы, созданные соединением
Убивает все глобальные курсоры, принадлежащие связи
Закрывает все открытые дескрипторы SQL-XML, которые открыты
Удаляет все открытые рабочие таблицы, связанные с SQL-XML
Закрывает все системные таблицы
Закрывает все пользовательские таблицы
Удаляет все временные объекты
Прерывает открытые транзакции
Дефекты распределенной транзакции при зачислении
Уменьшает количество ссылок для пользователей в текущей базе данных, которая снимает общие блокировки базы данных
Освобождает приобретенные замки
Отпускает любые приобретенные ручки
Сбрасывает все параметры SET к значениям по умолчанию
Сбрасывает значение @@rowcount
Сбрасывает значение @@
Сбрасывает любые параметры трассировки уровня сеанса с помощью dbcc traceon()
Сбрасывает CONTEXT_INFO в
NULL
в SQL Server 2005 и новее [не является частью оригинальной статьи]sp_reset_connection НЕ сбрасывается:
Контекст безопасности, поэтому пул соединений сопоставляет соединения на основе точной строки соединения
Роли приложений, введенные с помощью sp_setapprole, поскольку роли приложений не могут быть восстановлены
Примечание: я включаю этот список здесь, так как я не хочу, чтобы он был потерян в постоянно меняющейся сети.
Это признак того, что используется пул соединений (что хорошо).
Обратите внимание:
Если вы используете SET TRANSACTION ISOLATION LEVEL в хранимой процедуре или триггере, когда объект возвращает управление, уровень изоляции сбрасывается до уровня, действующего на момент вызова объекта. Например, если вы установили REPEATABLE READ в пакете, а затем пакет вызывает хранимую процедуру, которая устанавливает уровень изоляции SERIALIZABLE, настройка уровня изоляции возвращается в REPEATABLE READ, когда хранимая процедура возвращает управление пакету.