JetGetLock 函数

适用于:Windows |Windows服务器

JetGetLock 函数

JetGetLock 函数提供了一种显式保留更新行、写入锁或显式阻止其他任何会话更新、读取锁定的功能的方法。 通常,由于更新行,行写入锁是隐式获取的。 读取锁通常不需要,因为记录版本控制。 但是,在某些情况下,事务可能需要显式锁定行以强制实施序列化,或确保后续操作会因所需的锁而成功。

JET_ERR JET_API JetGetLock(
  __in          JET_SESID sesid,
  __in          JET_TABLEID tableid,
  __in          JET_GRBIT grbit
);

参数

sesid

将用于此调用的会话。

tableid

将用于此调用的游标。

grbit

包含用于此调用的选项的一组位,其中包括以下内容的零个或多个:

含义

JET_bitReadLock

此标志会导致在当前记录上获取读取锁。 读取锁与其他会话已持有的写入锁不兼容,但与其他会话持有的读取锁兼容。

JET_bitWriteLock

此标志会导致在当前记录上获取写入锁。 写入锁与其他会话持有的写入或读取锁不兼容,但与同一会话持有的读取锁兼容。

返回值

此函数使用以下返回代码之一返回 JET_ERR 数据类型。 有关可能的 ESE 错误的详细信息,请参阅可扩展存储引擎错误错误处理参数

返回代码

描述

JET_errSuccess

操作已成功完成。

JET_errClientRequestToStopJetService

无法完成该操作,因为由于调用 JetStopService,与会话关联的实例上的所有活动已停止。

JET_errInstanceUnavailable

无法完成该操作,因为与会话关联的实例遇到了一个致命错误,要求撤销对所有数据的访问权限以保护该数据的完整性。 此错误仅由 Windows XP 和更高版本返回。

JET_errInvalidgrbit

给定 的 grbit 既不是JET_bitReadLock也不是JET_bitWriteLock。 它必须是这两个标志之一。

JET_errNoCurrentRecord

游标必须位于记录上才能获取锁。 锁始终位于记录上。

JET_errNotInitialized

无法完成该操作,因为尚未初始化与会话关联的实例。

JET_errNotInTransaction

锁只能由事务中的会话获取。

JET_errPermissionDenied

游标不能是只读的,无法获取写入锁。

JET_errRestoreInProgress

无法完成操作,因为与会话关联的实例上正在进行还原操作。

JET_errSessionSharingViolation

同一会话不能同时用于多个线程。 此错误仅由 Windows XP 和更高版本返回。

JET_errTermInProgress

无法完成该操作,因为与会话关联的实例正在关闭。

JET_errTransReadOnly

会话必须具有写入权限才能获取写入锁。

JET_errWriteConflict

请求冲突锁时返回的错误。

成功后,会话已获取请求的锁。

失败时,会话尚未获取请求的锁。

注解

即使会话和游标最终不执行更新操作,也无法使用具有只读权限的会话或游标获取写入锁。 会话和游标必须具有写入权限才能获取写入锁。

读取和写入锁是悲观锁定的方法。 悲观锁定需要多个并发会话冲突,并提前获取锁,以确保其操作成功。

大多数操作将通过隐式采用的锁进行序列化。 但是,某些操作不会。 为了说明这一点,请考虑这两个事务:

T1:R (A) 、U (B)

T2:R (B) 、U (A)

记录级别版本控制将确保并发执行时每个事务都会看到 A 和 B 的原始值。如果结果依赖于读取的数据,则没有可针对 A 和 B 生成相同结果的串行执行顺序。 为了使应用程序能够序列化此事务,应在读取值时在每个事务中获取 A 和 B 的显式读取锁。

要求

要求

客户端

需要 Windows Vista、Windows XP 或 Windows 2000 Professional。

Server

需要Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。

标头

在 Esent.h 中声明。

Library

使用 ESENT.lib。

DLL

需要ESENT.dll。

另请参阅

JET_ERR
JET_SESID
JET_TABLEID
JetPrepareUpdate
JetStopService
JetUpdate