Поделиться через


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

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

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

ms177480.note(ru-ru,SQL.90).gifПримечание.
Для успешного завершения хранимых процедур sp_getbindtoken и srv_getbindtoken сеансу должна принадлежать активная пользовательская транзакция.

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

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

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

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

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

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

  • Локальный связанный сеанс
    Позволяет связанным сеансам совместно использовать пространство транзакции одной транзакции одного экземпляра компонента Database Engine.
  • Распределенный связанный сеанс
    Позволяет связанным сеансам совместно использовать одну и ту же транзакцию в двух или более экземплярах до тех пор, пока вся транзакция не будет зафиксирована или откатана с использованием координатора распределенных транзакций Microsoft.

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

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

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

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

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

См. также

Другие ресурсы

sp_bindsession (Transact-SQL)
srv_getbindtoken (Extended Stored Procedure API)
sp_getbindtoken (Transact-SQL)
SET REMOTE_PROC_TRANSACTIONS (Transact-SQL)
Extended Stored Procedures Programmer's Reference

Справка и поддержка

Получение помощи по SQL Server 2005