Режим транзакции для файловых операций в Java - PullRequest
40 голосов
/ 21 августа 2009

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

Я пытаюсь прочитать файл, выполнить некоторые операции с базой данных и переместить содержимое в другой файл. Мне было интересно, возможно ли выполнить все эти операции атомарным способом в Java, поэтому, если что-то пойдет не так в списке действий, откатите всю последовательность и вернитесь к начальной точке.

Заранее спасибо за помощь.

Ответы [ 6 ]

30 голосов
/ 21 августа 2009

Взгляните на Транзакция Apache Commons . Имеет возможность управлять файлами транзакционно.

Архивированная статья подробно описывает ее использование с файловой системой.

обновление

Имейте в виду, что статус на первой странице гласит:

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

8 голосов
/ 21 августа 2009

Нет стандартного API файла транзакций, однако я считаю, что есть проект Apache, который реализует то, что вы хотите.

http://commons.apache.org/transaction/file/index.html

Пакет транзакционных файлов предоставляет вам код, который позволяет вам выполнять атомарные операции чтения и записи в любой файловой системе. Диспетчер файловых ресурсов предлагает вам возможность изолировать ряд операций над набором файлов в транзакции. Используя пакет блокировок, он может предложить вам полные ACID транзакции, включая сериализуемость. Конечно, чтобы эта работа работала, весь доступ к управляемым файлам должен быть сделан этим менеджером. Непосредственный доступ к файловой системе не может контролироваться администратором.

обновление

Имейте в виду, что статус на первой странице гласит:

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

7 голосов
/ 16 марта 2010

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

Если ваше приложение не поддерживает JCA, вы также можете использовать автономный диспетчер транзакций, такой как Atomikos, и выполнять транзакции XA с использованием обоих файлов (с использованием XADisk) и базы данных.

обновление

Домашняя страница проекта больше не существует, и последний выпуск Maven был в 2013 году.

4 голосов
/ 21 августа 2009

Нет, по крайней мере, не простым звонком. Файловые системы в целом (и операции с файловой системой Java в частности) не поддерживают «откат».

Однако вы можете подражать этому. Распространенным способом было бы сначала переименовать файл, чтобы он был помечен как находящийся в процессе обработки. Например, добавьте суффикс.

Затем обработайте его, затем измените файл. Если что-то пойдет не так, просто откатите БД, переименуйте все файлы с суффиксами обратно в их исходные имена, и все готово.

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

3 голосов
/ 22 марта 2012

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

3 голосов
/ 21 августа 2009

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

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

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