Недавно я преобразовал формат файла рабочей области для своего приложения в sqlite. Чтобы обеспечить надежную работу NFS, я использовал общую политику обновления, я делаю все модификации копии, хранящейся во временном месте на локальном жестком диске. Только при сохранении я изменяю исходный файл (возможно, в NFS), копируя исходный файл с временным файлом. Я открываю исходный файл только для того, чтобы сохранить на нем эксклюзивную блокировку, поэтому, если кто-то другой попытается открыть его, он будет предупрежден, что его использует кто-то другой.
Проблема в следующем: когда я иду, чтобы сохранить свой временный файл обратно поверх исходного файла, я должен снять блокировку с исходного файла, это дает кому-то еще окно, чтобы войти и взять оригинал, хотя и небольшое окно.
Я могу придумать несколько способов обойти это:
(1) заключается в том, чтобы просто сбросить содержимое temp в оригинал с помощью sql, т. е. удалить таблицы в оригинале, очистить оригинал, выбрать из temp и вставить в оригинал. Однако мне не нравится выполнять операции sql с файлом sqlite, хранящимся в NFS. Это пугает меня проблемами с коррупцией. Прав ли я, думая так?
(2) Используйте различные дополнительные файлы, чтобы действовать как охранник, чтобы предотвратить вход других при копировании временного файла поверх оригинала. Использование файлов в качестве мьютекса в лучшем случае проблематично. Мне также не нравится идея наличия лишних файлов в случае сбоя приложения.
Мне интересно, есть ли у кого-нибудь другие решения для этого. Снова скопировать временный файл поверх исходного файла, при этом гарантируя, что другое приложение не проникнет и не захватит исходный файл при этом?
Я использую python2.5, sqlalchemy 0.6.6 и sqlite 3.6.20.
Спасибо, Дин