适用于: Windows |Windows Server
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 专业版。 | 
| 服务器 | 需要 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