2010-03-26 3 views
6

Я работаю над проектом по управлению файлами в Интернете. Мы храним ссылки на базу данных (sql-сервер) и файлы данных в файловой системе.Как обеспечить координацию между файловой системой и базой данных?

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

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

Пожалуйста, дайте мне некоторое решение, как бороться с такой ситуацией. Мне это очень нужно.

Этот случай случается и при удалении файла?

+0

Файловая система может рассматриваться как конкретная база данных, хотя она не использует SQL и особенно настроена для хранения блоков. Поэтому в некотором смысле вы спрашиваете, как гарантировать атомарность в двух базах данных (файловой системе и вашей РСУБД). Возможно ли создать архитектуру вашей системы, чтобы она использовала только одну или другую? – Will

+0

нет, мы используем RDBMS для хранения ссылок и файловой системы для хранения файлов данных/файлов тела? –

+0

Очевидный ответ заключается в том, чтобы делать что-то наоборот: базы данных, как правило, менее подвержены действию, чем файловые системы. – 2010-03-27 09:58:03

ответ

0

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

5

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

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

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

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

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

1

старый вопрос, который я знаю, но на благо других читателей:

В зависимости от вашей операционной системы, вы можете быть в состоянии использовать транзакционной TxF

http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

+0

Обратите внимание, что Microsoft в настоящее время планирует отказаться от TxF в будущем. Они рекомендуют использовать [альтернативные подходы] (http://msdn.microsoft.com/en-us/hh802690), такие как [SQL FILESTREAM] (http://technet.microsoft.com/en-us/library/bb933993.aspx) с. – mwolfe02