Подтвердить что ты не робот

Режим транзакции для файловых операций в Java

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

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

Заранее благодарим за помощь.

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Вы могли бы, однако, подражать этому. Обычным способом было бы сначала переименовать файл так, чтобы он был помечен как "обрабатываемый". Например, добавьте некоторый суффикс.

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

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

Ответ 6

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

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