JetGetLock 函式
適用于: 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 Professional。 |
Server |
需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。 |
標頭 |
在 Esent.h 中宣告。 |
程式庫 |
使用 ESENT.lib。 |
Dll |
需要ESENT.dll。 |
另請參閱
JET_ERR
JET_SESID
JET_TABLEID
JetPrepareUpdate
JetStopService
JetUpdate