Как реализовать ACID Transaction в Java? - PullRequest
0 голосов
/ 05 июня 2018

Мне нужно выполнить 2 действия: одно для сохранения данных в БД, одно для сохранения байтов в файловой системе, и я хотел бы, чтобы эти 2 действия выполнялись атомарно.В основном, если действие 1 завершается неудачей, весь процесс завершается неудачей, а если действие 2 не выполняется, то же самое и действие db откатывается.

public void doAction() {
   this.saveData();
   this.saveFile();
}

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

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

В общем случае это просто невозможно.

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

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

0 голосов
/ 05 июня 2018

ACID требует не только возможности откат изменений при сбое одной из операций, но и изоляция от другой транзакции.Как только вы сохраняете данные в файл, изменения становятся видимыми для других.Любая фиксация базы данных до или после является нарушением правил ACID.

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

Также рассмотрите возможность хранения данных в большом двоичном файле вместо файла.

Еще один более сложныйОдним из способов является блокировка доступа к данным файловой системой, поэтому при записи транзакции все остальные блокируются от чтения и записи файла и соответствующих данных базы данных одновременно.Например, используйте пустой файл блокировки (original-filename.lock), который блокирует чтение / запись данных в этом файле другими пользователями.Это работает только в том случае, если у вас есть отношение «1: 1» к данным базы данных, и если вы не выполняете сложных запросов (вы не должны читать данные, пока они заблокированы).И, конечно, это работает, только если вы контролируете все, что обращается к файлу или базе данных.Это может быть не очень эффективно.Вам все еще нужно реализовать механизм отката для изменений файла (обычно это копирование-переименование).

Существует несколько других решений или обходных путей, в зависимости от вашей конкретной системы.Этот вопрос, вероятно, "слишком широкий".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...