Функция 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 при следующих условиях:
|
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