Использование связанных сеансов

Связанные сеансы упрощают согласование действий в нескольких сеансах на одном и том же сервере. Связанные сеансы позволяют двум и более сеансам разделять одну и ту же транзакцию и блокировки и могут работать с одними и теми же данными без конфликтов блокировок. Связанные сеансы могут создаваться из нескольких сеансов внутри одного приложения или из нескольких приложений с отдельными сеансами.

Чтобы участвовать в связанном сеансе, сеанс вызывает хранимую процедуру sp_getbindtoken или хранимую процедуру srv_getbindtoken (через открытые службы данных) для получения связывающего маркера. Маркер привязки является символьной строкой, которая уникальным образом идентифицирует каждую связанную транзакцию. Затем маркер привязки отправляется в другие сеансы с целью быть связанным с текущим сеансом. Другие сеансы связываются с транзакцией, вызывая хранимую процедуру sp_bindsession и используя маркер привязки из первого сеанса.

ПримечаниеПримечание

Для успешного завершения хранимых процедур sp_getbindtoken и srv_getbindtoken сеансу должна принадлежать активная пользовательская транзакция.

Маркеры привязки должны передаваться из кода приложения, создающего первый сеанс, в код приложения, который последовательно связывает свои сеансы с первым сеансом. Не существует инструкции языка Transact-SQL или функции API, которую приложение могло бы использовать для получения маркера привязки для транзакции, инициализированной другим процессом. Вот некоторые методы, которые можно использовать для передачи маркера привязки:

  • Если сеансы инициализируются одним и тем же процессом приложения, то можно хранить маркеры привязки в памяти глобальных данных или передавать в функции в качестве параметров.

  • Если сеансы инициализируются разными процессами приложения, то можно передавать маркеры привязки с помощью механизмов межпроцессного взаимодействия (IPC), таких как удаленный вызов процедуры или динамический обмен данными.

  • Маркеры привязки можно хранить в таблице экземпляра компонента SQL Server Database Engine; процессы, связывающиеся с первым сеансом, могут считывать эту таблицу.

Только один связанный сеанс в наборе может быть активен в каждый момент времени. Если один сеанс выполняет инструкцию на экземпляре или ожидает результатов на экземпляре, то никакой другой связанный сеанс не может получить доступ к экземпляру до тех пор, пока первый сеанс не закончит обработку или не отменит текущую инструкцию. Если экземпляр занят и находится в процессе обработки инструкции с других связанных сеансов, то возникает ошибка, указывающая на то, что пространство транзакции находится в использовании и сеанс следует повторить позднее.

При связывании сеансов каждый сеанс сохраняет настройку своего уровня изоляции. Использование инструкции SET TRANSACTION ISOLATION LEVEL для изменения настройки уровня изоляции одного сеанса не влияет на настройки всех связанных с ним сеансов.

Типы связанных сеансов

Существует два типа связанных сеансов: локальный и распределенный.

  • Локальный связанный сеанс

    Позволяет связанным сеансам совместно использовать область транзакции одной транзакции одного экземпляра компонента Database Engine.

  • Распределенный связанный сеанс

    Позволяет связанным сеансам совместно использовать одну и ту же транзакцию в двух или более экземплярах до тех пор, пока вся транзакция не будет зафиксирована или откатана с использованием координатора распределенных транзакций (Майкрософт) (MS DTC).

Распределенные связанные сеансы не идентифицируются символьной строкой связывающего маркера, они идентифицируются номерами идентификации для распределенных транзакций. Если связанный сеанс входит в локальную транзакцию и выполняет вызов удаленной процедуры на удаленном сервере и при этом параметр SET REMOTE_PROC_TRANSACTIONS включен, то локальная связанная транзакция автоматически продвигается до распределенной связанной транзакции координатором распределенных транзакций (MS DTC) и начинается сеанс (MS DTC).

Когда использовать связанные сеансы

В более ранних версиях SQL Server связанные сеансы в основном использовались в разработке расширенных хранимых процедур, которые должны выполнять инструкции языка Transact-SQL от имени вызывающего их процесса. Передача вызывающего процесса в виде маркера привязки в параметре расширенной хранимой процедуры позволяет процедуре присоединять область транзакции вызывающего процесса, соединяя таким образом хранимую процедуру с вызывающим процессом.

В компоненте SQL Server Database Engine хранимые процедуры CLR более безопасны, масштабируемы и устойчивы, чем расширенные хранимые процедуры. Хранимые процедуры CLR для присоединения контекста вызывающего сеанса используют объект SqlContext, а не хранимую процедуру sp_bindsession.

Связанные сеансы можно использовать для построения трехзвенных приложений, в которых бизнес-логика разделена на отдельные программы, которые работают вместе на одной бизнес-транзакции. В коде этих программ должен быть тщательно согласован доступ к базе данных. Так как два сеанса совместно используют одни и те же блокировки, две программы не должны одновременно пытаться модифицировать одни и те же данные. В каждый момент времени только один сеанс может выполнять работу, являющуюся частью транзакции; недопустимо параллельное выполнение. Переключение транзакции между сеансами возможно только в определенных точках выхода, например, когда завершены DML-инструкции и восстановлены их результаты.