Доступ к файловой системе действительно не является транзакционным. Вам нужно будет смоделировать распределенной транзакции «все или ничего»: если в результате сбоя в базе данных произойдет сбой, удалите файл в файловой системе. И наоборот, если запись файла не удалась, транзакция транзакции отката (это будет немного сложнее, но это приблизительный эскиз).
Обратите внимание, что при обновлении файла может быть довольно сложно. Вам нужно сначала скопировать его, чтобы при сбое транзакции базы данных после перезаписывания файла вы все равно можете восстановить старую версию файла. Если вы хотите это сделать, это зависит от уровня надежности .
Попробуйте ввести в действие все манипуляции, проходящие через ваше приложение (создание, запись, удаление файлов). Если вы не можете этого сделать, и вы не можете запретить доступ к файлу напрямую в файловой системе (и, возможно, удален), я не вижу другого способа, кроме как периодически синхронизировать базу данных с файловой системой: проверьте, какой файл был удален и удалён запись в базе данных. Вы можете создать задание, которое запускает каждый X минут для этого.
Я также предлагаю хранить хэш-код (например, MD5) файла в базе данных. Потратьте немного времени, чтобы вычислить его, но для меня было очень полезно обнаружить проблемы, например. если файл переименовывается в файловую систему по ошибке, но не в базу данных. Это также позволяет периодически проверять целостность, чтобы убедиться, что ничего не было завинчено.
Если этого подхода недостаточно (например, вы хотите, чтобы он был более надежным), я не вижу другого способа, кроме как хранить двоичный файл в базе данных в LOB. Тогда это будет действительно транзакционным и безопасным.
Файловая система может рассматриваться как конкретная база данных, хотя она не использует SQL и особенно настроена для хранения блоков. Поэтому в некотором смысле вы спрашиваете, как гарантировать атомарность в двух базах данных (файловой системе и вашей РСУБД). Возможно ли создать архитектуру вашей системы, чтобы она использовала только одну или другую? – Will
нет, мы используем RDBMS для хранения ссылок и файловой системы для хранения файлов данных/файлов тела? –
Очевидный ответ заключается в том, чтобы делать что-то наоборот: базы данных, как правило, менее подвержены действию, чем файловые системы. – 2010-03-27 09:58:03