Opportunistic Locks 的類型

商機鎖定作業適用于四種類型的機會鎖定:層級 1、層級 2、批次和篩選。 獨佔的商機鎖定 是層級 1、批次和篩選鎖定。 如果執行緒在檔案上具有任何類型的獨佔鎖定,它也無法在同一個檔案上擁有層級 2 鎖定。

層級 1 Opportunistic 鎖定

檔案上的層級 1 機會鎖定可讓用戶端在檔案中事先讀取,並在本機快取讀取和寫入檔案的資料。 只要用戶端只能存取檔案,提供層級 1 的機率鎖定時,資料一致性就沒有任何危險。

用戶端可以在開啟檔案之後要求層級 1 的機率鎖定。 如果沒有其他用戶端 (,或相同用戶端上沒有其他執行緒) 開啟檔案,伺服器可能會授與機會鎖定。 然後,用戶端就可以在本機快取檔案的讀取和寫入資料。 如果另一個用戶端已開啟檔案,則伺服器會拒絕機會鎖定,而用戶端不會進行本機快取。 (伺服器可能也基於其他原因拒絕機會鎖定,例如不支援不具機會的鎖定。)

當伺服器開啟的檔案已經有層級 1 的機率鎖定時,伺服器會先檢查檔案的共用狀態,再中斷層級 1 的機率鎖定。 如果伺服器在此檢查之後中斷鎖定,則具有先前鎖定的用戶端花費排清寫入快取的時間是要求檔案的用戶端必須等候的時間。 這次支出表示應該避免對許多用戶端開啟的檔案進行層級 1 的機率鎖定。

不過,由於伺服器在中斷鎖定之前會先檢查共用狀態,因此在伺服器因為共用衝突而拒絕開啟要求的情況下,伺服器不會中斷鎖定。 例如,如果您已開啟檔案、拒絕共用寫入作業,並取得層級 1 鎖定,伺服器會拒絕另一個用戶端要求開啟檔案以供寫入,甚至檢查檔案上的鎖定。 在此實例中,您的機會鎖定不會中斷。

如需層級 1 機率鎖定運作方式的範例,請參閱層級 1 Opportunistic 鎖定範例。 如需中斷商機鎖定的詳細資訊,請參閱 中斷操作鎖定

層級 2 Opportunistic 鎖定

層級 2 機會鎖定會通知用戶端檔案有多個並行用戶端,且尚未修改檔案。 此鎖定可讓用戶端執行讀取作業,並使用快取或預先讀取的本機資訊取得檔案屬性,但用戶端必須將所有其他要求傳送 (,例如將寫入作業) 至伺服器。 當您預期其他應用程式隨機寫入檔案,或隨機或循序讀取檔案時,您的應用程式應該使用層級 2 的機率鎖定。

層級 2 的機率鎖定與篩選機率鎖定非常類似。 在大部分情況下,您的應用程式應該使用層級 2 的機率鎖定。 如果您不想開啟作業來讀取,只會使用篩選鎖定,以在應用程式開啟檔案和接收鎖定之間的時間範圍中造成共用模式違規。 如需詳細資訊,請參閱篩選鎖定和 伺服器回應,以開啟鎖定檔案上的要求

如需中斷商機鎖定的詳細資訊,請參閱 中斷操作鎖定

Batch Opportunistic Locks

批次機率鎖定會操作檔案開啟和關閉。 例如,在執行批次檔中,可能會針對檔案的每一行開啟和關閉批次檔一次。 批次機會鎖定會在伺服器上開啟批次檔,並讓它保持開啟。 當命令處理器「開啟」和「關閉」批次檔時,網路重新導向器會攔截開啟和關閉的命令。 所有伺服器接收都是搜尋和讀取命令。 如果用戶端也事先閱讀,伺服器最多一次會收到特定的讀取要求。

開啟已經有批次機率鎖定的檔案時,伺服器會在中斷鎖定之後檢查檔案的共用狀態。 此檢查可讓鎖定的持有者有機會完成清除其快取並關閉檔案控制代碼。 在共用檢查期間嘗試的開啟作業,如果鎖定持有者釋放鎖定,則共用檢查不會失敗。

如需批次商機鎖定運作方式的範例,請參閱 Batch Opportunistic Lock 範例。 如需中斷商機鎖定的詳細資訊,請參閱 中斷操作鎖定

篩選作業鎖定

篩選機率鎖定會鎖定檔案,使其無法開啟以進行寫入或刪除存取。 所有用戶端都必須能夠共用檔案。 篩選鎖定可讓應用程式對檔案資料執行非干擾篩選作業 (,例如編譯器開啟原始程式碼或編錄程式) 。

篩選機率鎖定與層級 2 的機率鎖定不同,因為它允許開啟作業進行讀取,而不會在應用程式開啟檔案和接收鎖定之間的時間範圍內發生共用模式違規。 篩選機率鎖定是允許其他用戶端讀取存取權時使用的最佳鎖定。 在其他情況下,您的應用程式應該使用層級 2 的機率鎖定。 篩選機率鎖定與批次的機率鎖定不同,因為它不允許網路重新導向器處理多個開啟和關閉,而批次機會鎖定的處理方式。

您的應用程式應該在三個步驟中要求檔案上的篩選機率鎖定:

  1. 使用 CreateFile 函式開啟檔案控制碼,並將 DesiredAccess 參數設定為零,表示沒有存取權,而 dwShareMode 參數會設定為 FILE_SHARE_READ 旗標,以允許共用以進行讀取。 此時取得的控制碼稱為鎖定控制碼。
  2. 使用 FSCTL_REQUEST_FILTER_OPLOCK 控制項程式碼要求此控制碼上的鎖定。
  3. 授與鎖定時,請使用 CreateFile 再次開啟檔案,並將 DesiredAccess 設定為 GENERIC_READ 旗標。 將 dwShareMode 設定為 FILE_SHARE_READ 旗標,以允許其他人在開啟檔案時讀取檔案、 FILE_SHARE_DELETE 旗標,以允許其他人在開啟檔案時標記檔案以進行刪除,或兩者。 此時取得的控制碼稱為讀取控制碼。

使用讀取控制碼來讀取或寫入檔案的內容。

開啟已經有篩選機率鎖定的檔案時,伺服器會中斷鎖定,然後檢查檔案的共用狀態。 此檢查可讓保留先前的商機鎖定的用戶端放棄任何快取的資料,並認可中斷。 在此共用檢查期間嘗試的開啟作業,如果先前的鎖定持有者釋放鎖定,則共用檢查不會失敗。 檔案系統會保持開啟作業,直到鎖定的擁有者同時關閉讀取控制碼和鎖定控制碼為止。 完成此動作之後,另一個用戶端的開啟要求可以繼續進行。

如需中斷商機鎖定的詳細資訊,請參閱 中斷操作鎖定