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


Функция JetSetSessionContext

Применимо к: Windows | Windows Server

Функция JetSetSessionContext

Функция JetSetSessionContext связывает сеанс с текущим потоком, используя заданный дескриптор контекста. Эта связь переопределяет требование подсистемы по умолчанию о том, что транзакция для данного сеанса должна выполняться полностью в одном потоке.

    JET_ERR JET_API JetSetSessionContext(
      __in          JET_SESID sesid,
      __in          JET_API_PTR ulContext
    );

Параметры

sesid

Сеанс, используемый для этого вызова.

ulContext

Уникальный идентификатор, с которым будет связан этот сеанс.

Возвращаемое значение

Эта функция возвращает тип данных JET_ERR с одним из следующих кодов возврата. Дополнительные сведения о возможных ошибках ESE см. в разделах Ошибки подсистемы расширяемого хранилища и Параметры обработки ошибок.

Код возврата

Описание

JET_errSuccess

Операция выполнена успешно.

JET_errClientRequestToStopJetService

Операция не может завершиться, так как все действия на экземпляре, связанном с сеансом, прекратились в результате вызова JetStopService.

JET_errInstanceUnavailable

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

Windows XP: Это возвращаемое значение появилось в Windows XP.

JET_errInvalidParameter

Один из предоставленных параметров содержал непредвиденное значение или сочетание нескольких значений параметров привело к непредвиденному результату. Эта ошибка будет возвращена JetSetSessionContext при следующих условиях:

  • ulContext имеет значение NULL

  • ulContext имеет значение -1

JET_errNotInitialized

Операция не может завершиться, так как экземпляр, связанный с сеансом, еще не инициализирован.

JET_errRestoreInProgress

Операция не может завершиться, так как выполняется операция восстановления на экземпляре, связанном с сеансом.

JET_errSessionContextAlreadySet

Не удалось связать сеанс с текущим потоком, так как он уже связан с потоком.

JET_errTermInProgress

Операция не может завершиться, так как экземпляр, связанный с сеансом, завершает работу.

Если эта функция будет выполнена успешно, сеанс будет связан с текущим потоком. Изменение состояния базы данных не произойдет.

Если эта функция завершается сбоем, состояние сеанса останется неизменным. Изменение состояния базы данных не произойдет.

Комментарии

Сеанс обычно привязан к определенному потоку в течение транзакции. Это поведение помогает приложениям обнаруживать и предотвращать концептуально нерекоменндный общий доступ к одному сеансу между несколькими потоками. Иногда эта простая проверка не работает с архитектурой приложения. Например, если приложение размещает серверные объекты с помощью пула потоков и транзакции охватывают несколько вызовов сервера к заданному объекту, то эта защита может привести к сбою некоторых из этих вызовов с JET_errSessionSharingViolation даже если шаблон использования правильный. Такая ситуация распространена для серверов ОБЪЕКТОВ COM.

JetSetSessionContext и JetResetSessionContext решают эту проблему, делая общий доступ к сеансам проверка немного более гибким. Когда приложение начинает выполнять серию вызовов API ESE с помощью определенного сеанса, оно сначала задает для контекста сеанса заданное значение. Это действие связывает сеанс с вызывающим потоком. В данном примере этот контекст может быть адресом объекта, содержащего дескриптор сеанса JET. После выполнения вызовов API ESE приложение сбрасывает контекст сеанса. Это действие отменяет связь сеанса с вызывающим потоком. Затем объект и его сеанс могут использоваться другим потоком, даже если в сеансе есть активная транзакция.

Важно отметить, что перед открытием транзакции в этом сеансе необходимо вызвать JetSetSessionContext , иначе связь не будет работать.

JetSetSessionContext является потокобезопасной. Несколько потоков могут попытаться задать контекст потока в одном сеансе одновременно, и только один из них победит. Этот факт может использоваться приложением для выделения сеанса из пула без сохранения внешнего состояния о выделении.

Требования

Требование Значение

Клиент

Требуется Windows Vista, Windows XP или Windows 2000 Профессиональная.

Сервер

Требуется Windows Server 2008, Windows Server 2003 или Windows 2000 Server.

Верхняя часть

Объявлено в Esent.h.

Библиотека

Используйте ESENT.lib.

DLL

Требуется ESENT.dll.

См. также:

JET_API_PTR
JET_ERR
JetResetSessionContext
JET_SESID
JetStopService