Какие сетевые файловые системы не обеспечивают правильную блокировку?
Считаю, что правильный ответ вкратце: «Все они».
Это должно учитываться в контексте нескольких процессов на нескольких компьютерах, обращающихся к одной и той же базе данных по сети. Не должно возникнуть проблем, когда все процессы, обращающиеся к базе данных, выполняются на одном компьютере, если ядро базы данных (SQLite) использует инструменты исключения, такие как семафоры или мьютекс (и использует их правильно ...).
Причина этого заключается в том, что информация о том, что заблокировано, обычно хранится в контексте «процесса X блокирует Y». Это может очень хорошо работать, когда все процессы выполняются на одном компьютере, но не очень хорошо, когда они находятся на разных компьютерах.
Когда процесс с одного компьютера получает доступ к файлу на другом компьютере, локальная операционная система заменяет собой удаленный процесс, фактически работая агентом для процесса, о котором он ничего не знает. У него могут даже быть трудности в различении двух разных процессов, выполняющихся на одном и том же удаленном компьютере, и они ошибочно принимают один за другим.
Для правильной блокировки файлов, всего файла или его части, действительно потребуется одна операционная система, которая выполняется на всех задействованных компьютерах с централизованным хранилищем данных для блокировки файлов. К сожалению, ни Linux, ни Windows не могут сделать это в общем случае.
Лучшее соглашение по теме SQLite можно найти в разделе «Как повредить файлы базы данных» в предыдущей статье «
Блокировка и параллелизм файлов в SQLite версии 3» . Это подробности, которые системные вызовы SQLite используют для обеспечения параллелизма в Windows и Linux как для блокировки файловых секций, так и для сброса обновленных данных с компьютера в базу данных. Все перечисленные функции будут хорошо работать только в контексте одного компьютера. Соответственно, эта статья содержит предложение «Ваша лучшая защита - не использовать SQLite для файлов в сетевой файловой системе».
Обратите внимание, что проблема сброса данных в базу данных вызывает особую тревогу, поскольку операционная система обычно задерживает запись, поэтому вы можете столкнуться с ситуацией, когда процесс обновления сбрасывает данные и снимает блокировку, но новые данные, возможно, еще не поступили в базу данных, когда другой процесс попытался прочитать его, таким образом легко заканчивая поврежденной базой данных.
Некоторые дополнительные сведения можно найти в статье SQLite «
Атомная фиксация в SQLite» , раздел «
Что может пойти не так» . Это добавляет случай, когда разные процессы и компьютеры могут использовать разные механизмы блокировки, когда один не блокирует другой.
В системах управления базами данных, которые решили эту проблему, таких как Oracle или SQL Server, решение состоит в том, чтобы назначить один конкретный компьютер единственным, который может обновлять базу данных, поэтому блокировка значительно упрощается. Другие компьютерные сетевые системы, такие как
Apache Hadoop,
предоставляют собственные механизмы блокировки для решения этих проблем.
Еще одна интересная статья - «
О сломанности блокировки файлов» .