Операции уступающей блокировки работают с четырьмя типами уступающих блокировок: уровень 1, уровень 2, пакет и фильтр. Исключающие уступающие блокировки (Exclusive opportunistic locks) являются блокировками уровня 1, пакет и фильтр. Если у потока имеется какой-либо тип исключающей блокировки файла, поток не может иметь к тому же блокировку уровня 2 того же самого файла.
Уступающая блокировка уровня 1 файла дает возможность клиенту делать опережающее чтение в файле и кэшировать и опережающее чтение, и запись данных из файла локально. Пока у клиента имеется исключительный доступ к файлу, то нет никакой опасности для последовательности данных в обеспечении уступающей блокировки уровня 1.
Клиент может запросить уступающую блокировку уровня 1 после открытия файла. Если ни у какого другого клиента (или ни у какого другого потока того же самого клиента) нет открытого файла, сервер может предоставить уступающую блокировку. Клиент может в это время кэшировать чтение и запись данных из файла локально. Если другой клиент открыл файл, то сервер отказывается от уступающей блокировки, а клиент не может делать какое-либо локальное кэширование. (Сервер может отказаться от уступающей блокировки также и по другим причинам, таким как отсутствие поддержки уступающих блокировок).
Когда сервер открывает файл, у которого уже есть уступающая блокировка уровня 1, то сервер проверяет состояние совместного использования файла перед тем, как он прерывает уступающую блокировку уровня 1. Если сервер прерывает блокировку после этой экспертизы, время, которое клиент с прежней блокировкой затрачивает для сбрасывания на диск свой записанный кэш, является временем, которое клиент, запрашивающий файл, должен ждать. Этот расход времени означает, что уступающих блокировок уровня 1 нужно избегать в файлах, которые открывают много клиентов.
Однако, поскольку сервер проверяет состояние совместного использования файла, прежде чем он прервет блокировку, в случае когда сервер отклоняет запрос на открытие из-за конфликта совместного использования, то он не прерывает блокировку. Например, если Вы открыли файл, отклонили совместное использование для операций записи и получили блокировку уровня 1, сервер отклоняет запрос другого клиента на открытие файла для того, чтобы записать в него даже после того как он проверит Вашу блокировку на файле. На этом этапе Ваша уступающая блокировка не прерывается.
Пример того, как уступающая блокировка уровня 1 работает, см. в статье Примеры уступающих блокировок уровня 1. Дополнительную информацию о прерывании уступающих блокировок, см. в статье Прерывание уступающих блокировок.
Уступающая блокировка уровня 2 сообщает клиенту, что имеется несколько клиентов - конкурентов на файл, и что ни один из них еще не модифицировал его. Эта блокировка дает возможность клиенту выполнять операции чтения и получать кэшируемое использование атрибутов файла или опережающее чтение локальных данных, но клиент должен отправить все другие запросы (например для операций записи) на сервер. Ваше приложение должно использовать уступающую блокировку уровня 2 тогда, когда Вы предполагаете, что другие приложения будут произвольно писать в файл или читать файл произвольно или последовательно.
Уступающая блокировка уровня 2 очень подобна фильтру уступающей блокировки. В большинстве ситуаций Ваше приложение должно использовать уступающую блокировку уровня 2. Фильтр блокировки используйте только тогда, если Вы не хотите открывать операции чтения, которые вызовут нарушения режима совместного использования файла на отрезке времени между открытием файла Вашим приложением и получением блокировки. Дополнительную информацию смотри в статьях Фильтры уступающих блокировок и Ответ сервера на запрос открыть блокированные файлы.
Дополнительную информацию о прерывании уступающих блокировок, см. в статье Прерывание уступающих блокировок.
Пакетная уступающая блокировка управляет открытиями и закрытиями файла. Например, при исполнении кода пакетного файла, пакетный файл может быть открыт и закрыт один раз для каждой строки файла. Пакетная уступающая блокировка открывает пакетный файл на сервере и сохраняет его открытым. Поскольку процессор команд "открывает" и "закрывает" пакетный файл, сетевой редиректор перехватывает команды открытия и закрытия. Все серверы получают команды поиска и чтения. Если клиент к тому же делает опережающее чтение, то сервер получает особенный запрос на чтение более одного раза.
Открывая файл, у которого уже есть пакетная уступающая блокировка, сервер проверяет состояние совместного использования файла после прерывания блокировки. Эта проверка дает держателю блокировки шанс завершить сбрасывание на диск его кэша и закрыть дескриптор файла. Операция открытия, предпринятая в ходе проверки совместного использования файла, не заставляет проверку совместного использования завершаться ошибкой, если держатель блокировки освобождается от блокировки.
Пример того, как пакетная уступающая блокировка работает, см. статью Пример пакетной уступающей блокировки. Дополнительную информацию о прерывании уступающих блокировок, см. в статье Прерывание уступающих блокировок.
Фильтр уступающей блокировки блокирует файл так, что он не может быть открыт ни для чтения, ни для удаления доступа к нему. Все клиенты должны быть в состоянии совместного использования файла. Фильтр блокировки дает возможность приложениям выполнять ненавязчивые операции фильтрования данных файла (например компилятора, открывающего исходный код или программу каталогизации).
Фильтр уступающей блокировки отличается от уступающей блокировки уровня 2 тем, что он дает возможность операции открытия для чтения файла, происходящее без нарушений режима совместного использования файла в отрезке времени между открытием Вашим приложением файла и получением блокировки. Фильтр уступающей блокировки - это лучшая блокировка для того, чтобы использовать её, когда важно дать возможность другим клиентам доступа к чтению. В других случаях Ваша программа должна использовать уступающую блокировку уровня 2. Фильтр уступающей блокировки отличается от пакетной уступающей блокировки в том, что он не позволяет многократным открытиям и закрытиям быть обработанными сетевым редиректором способом, которым это делает пакетная уступающая блокировка.
Ваше приложение должно запросить фильтр уступающей блокировки файла за три этапа:
Используйте дескриптор чтения, чтобы читать из или писать в содержимое файла.
Открывая файл, у которого уже есть фильтр уступающей блокировки, сервер прерывает блокировку, а затем проверяет состояние совместного использования файла. Эта проверка дает клиенту, который удерживал прежнюю уступающую блокировку, шанс отказаться от любого кэширования данных и подтвердить приостановку программы. Операция открытия, предпринятая в ходе этой проверки совместного использования, не может заставит её завершиться ошибкой, если прежний держатель блокировки освобождает файл от блокировки. Файловая система удерживает во временном бездействии операцию открытия до тех пор, пока не владелец блокировки не закроет и дескриптор чтения, а затем и затем блокирующий дескриптор. После того, как это будет сделано, запрос на открытие другого клиента может продолжиться.
Дополнительную информацию о прерывании уступающих блокировок см. в статье Прерывание уступающих блокировок.