Могу ли я откатить транскрипцию JTA после ее фиксации? - PullRequest
0 голосов
/ 22 января 2011

У меня есть транзакция JTA, которую я фиксирую. Могу ли я откатить это после того, как я фиксирую? Если да, то как? У меня следующая ситуация.

  1. У меня есть бэкэнд-слой, который обновил 3 БД. Я использовал для этого пользовательский перевод JTA. Если обновление в какой-либо БД не удается, все обновления на 3 БД откатываются с помощью utx.rollback

  2. Теперь у меня есть слой поверх внутреннего слоя, который обновляет некоторые другие БД. Теперь я хочу, чтобы шаг 1 и шаг 2 оба выполнялись успешно или оба не выполнялись, поэтому я хочу откатить JTA-преобразование шага 1 в случае сбоя шага 2.

Мне сложно поместить код шага 2 в 1, так как мы используем некоторые существующие API для обновления БД на шаге 2.

Ответы [ 4 ]

3 голосов
/ 22 января 2011

Невозможно откатить транзакцию после ее совершения.

2 голосов
/ 22 января 2011

Я думаю, что ответ заключается в том, что вы не можете делать ничего подобного, используя JTA или другие RDBM.

Транзакции либо зафиксированы, либо отменены. После успешной фиксации их нельзя откатить.

Единственным возможным выходом может быть попытка использования вложенных транзакций и откат внешней транзакции. Но это, вероятно, не сработает:

  • Не все реализации JTA поддерживают вложенные транзакции.
  • Даже если они это сделали, нет гарантии, что внешняя транзакция будет успешно зафиксирована. И это может оставить вас с «другой» зафиксированной БД и откатом транзакции JTA.

Похоже, вам придется переосмыслить свои API персистентности.

1 голос
/ 22 января 2011

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

Конечно, есть способ вернуться в предыдущее состояние, и терминология называется «восстановление на момент времени». Механизм восстановления на момент времени Oracle называется FlashBack.

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm

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

Но суть в том, что для этого нет интерфейса JTA. (Фактически это выходит за рамки диспетчера транзакций.)

Лучше всего зарегистрировать точки сохранения в своей транзакции без фиксации и отката к точке сохранения в случае сбоя одной или нескольких операций.

0 голосов
/ 28 июля 2011

Нельзя откатить зафиксированную транзакцию, независимо от того, является ли она транзакцией XA или не XA.

Чтобы решить упомянутую проблему, нужно включить ВСЕ задействованные ресурсы в одну транзакцию XA.

Если приведенное выше решение по какой-либо причине неосуществимо, вы можете сделать это: а) Попросите подготовить первый слой (из 3 БД). б) Если результат (а) в порядке, сделайте коммит 4-й БД. c) Если результат (b) в порядке, вызовите фиксацию второй фазы для 3 БД.

НТН.

Спасибо, Нитин

...