Как принести координацию между файловой системой и базой данных?

Я работаю над проектом управления файлами онлайн. Мы храним ссылки на базе данных (SQL-сервер) и данные файлов по в файловой системе.

Мы сталкиваемся с проблемой координации между файловой системой и базой данных, в то время как мы загружаем файл и также в случае удаления файла. Сначала мы создаем ссылку в базе данных или храним файлы в файловой системе.

Проблема состоит в том, что, если я создаю ссылку в базе данных сначала и затем храню файл в файловой системе, но храня файлы в файловой системе любой тип ошибки происходят, затем ссылка для того файла создается в базе данных, но никакие данные файла не существуют в файловой системе.

Дайте мне некоторое решение, как справиться с такой ситуацией. Я плохо нуждаюсь в нем.

Этот случай происходит также в то время как мы удаляющий файл?

8
задан ewernli 27 March 2010 в 09:54
поделиться

2 ответа

Доступ к файловой системе действительно не транзакционный. Вам нужно будет смоделировать распределенную транзакцию «все или ничего» самостоятельно: если фиксация в базе данных завершится неудачно, удалите файл в файловой системе. И наоборот, если запись файла не удалась, откатите транзакцию базы данных (это будет немного сложнее, но это грубый набросок).

Обратите внимание, что при обновлении файла все может стать довольно сложным. Сначала вам нужно скопировать его, чтобы в случае сбоя транзакции базы данных после перезаписи файла вы все равно могли восстановить старую версию файла. Хотите ли вы это сделать, зависит от желаемого уровня устойчивости .

Постарайтесь сделать так, чтобы все манипуляции выполнялись через ваше приложение (создание, запись, удаление файлов). Если вы не можете этого сделать и не можете предотвратить доступ к файлу непосредственно в файловой системе (и, возможно, удаление), я не вижу другого способа, кроме периодической синхронизации базы данных с файловой системой: проверьте, какой файл был удален, и удалите запись в базе данных. Для этого вы можете создать задание, которое запускается каждую X минуту.

Я также предлагаю сохранить хэш (например, MD5) файла в базе данных. Потратьте немного времени на его вычисление, но для меня это было чрезвычайно полезно для обнаружения проблем, например если файл переименован в файловой системе по ошибке, но не в базе данных. Это также позволяет периодически запускать некоторую проверку целостности, чтобы убедиться, что ничего не было испорчено.

Если этого подхода недостаточно (например, вы хотите, чтобы он был более надежным), я не вижу другого способа, кроме как сохранить двоичный файл в базе данных в LOB. Тогда это будет действительно транзакционно и безопасно.

6
ответ дан 5 December 2019 в 21:17
поделиться

Рассматривайте эти два события (управление ссылкой и управление файлом) как одну транзакцию. Если одно из них не работает, отмените другое. Тогда вам будет трудно попасть в ситуацию, когда эти два события не синхронизированы. Откат операций с базой данных проще, чем операций с файловой системой.

0
ответ дан 5 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: