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 |
操作无法完成,因为与会话关联的实例遇到严重错误,要求撤销对所有数据的访问权限以保护该数据的完整性。 Windowsxp: 此返回值是在 Windows XP 中引入的。 |
JET_errInvalidParameter |
提供的其中一个参数包含意外值,或者多个参数值的组合产生了意外的结果。 在以下情况下, JetSetSessionContext 将返回此错误:
|
JET_errNotInitialized |
操作无法完成,因为与会话关联的实例尚未初始化。 |
JET_errRestoreInProgress |
操作无法完成,因为正在对与会话关联的实例执行还原操作。 |
JET_errSessionContextAlreadySet |
会话无法与当前线程关联,因为它已与线程关联。 |
JET_errTermInProgress |
操作无法完成,因为正在关闭与会话关联的实例。 |
如果此函数成功,会话将与当前线程相关联。 不会更改数据库状态。
如果此函数失败,会话状态将保持不变。 不会更改数据库状态。
备注
会话通常在事务持续时间内绑定到特定线程。 此行为旨在帮助应用程序检测和防止在概念上不明智的在多个线程之间共享单个会话。 有时,此简单检查不适用于应用程序的体系结构。 例如,如果应用程序使用线程池托管服务器端对象,并且事务跨越对给定对象的多个服务器调用,则此保护可能会导致其中一些调用失败并JET_errSessionSharingViolation即使使用模式正确也是如此。 这种情况对于 COM 对象服务器很常见。
JetSetSessionContext 和 JetResetSessionContext 通过使此会话共享检查更灵活一点来解决此问题。 当应用程序开始使用特定会话进行一系列 ESE API 调用时,它首先将会话上下文设置为给定值。 此操作将会话关联到调用线程。 在给定的示例中,此上下文可以是包含 JET 会话句柄的 对象的地址。 进行 ESE API 调用后,应用程序将重置会话上下文。 此操作将取消会话与调用线程的关联。 然后,对象及其会话可由另一个线程使用,即使该会话具有活动事务也是如此。
请务必注意,必须在该会话上打开事务之前调用 JetSetSessionContext ,否则关联将不起作用。
JetSetSessionContext 是线程安全的。 多个线程可以尝试同时在同一会话上设置线程上下文,并且只有一个线程将获胜。 应用程序可以使用此事实从池分配会话,而无需存储有关其分配的外部状态。
要求
要求 | 值 |
---|---|
客户端 |
需要 Windows Vista、Windows XP 或 Windows 2000 专业版。 |
服务器 |
需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。 |
标头 |
在 Esent.h 中声明。 |
Library |
使用 ESENT.lib。 |
DLL |
需要ESENT.dll。 |
另请参阅
JET_API_PTR
JET_ERR
JetResetSessionContext
JET_SESID
JetStopService