Подход, чтобы автоматически подключить / очистить XAResources в новый Tx? - PullRequest
1 голос
/ 10 февраля 2011

Поскольку TransactionManager не имеет возможности зарегистрировать менеджер XAResource, чтобы он мог подключать XAResources в будущих транзакциях.

Единственный способ решить эту проблему - обернуть дескриптор заинтересованного интерфейса сервиса. Каждый метод интерфейса выполняет следующие действия:

  • Проверьте, присутствует ли передача
  • выяснить, если ручка для этого TX
  • Если еще не участвует, подключите его XAResource, используя Transaction.enlist (XAResource)
  • Регистрирует обратный вызов для включения очистки с использованием Transaction.registerSynchronization (Synchronization).

Это кажется разумной стратегией?

1 Ответ

2 голосов
/ 10 февраля 2011

Это разумный первый набросок, но есть некоторые тонкости, на которые стоит обратить внимание. Правильно разобраться в угловых делах самостоятельно - возможно, вам лучше написать адаптер ресурсов для своего кода и иметь JCA для обработки транзакций, что и делают большинство драйверов баз данных и очередей сообщений.

  • То, что присутствует контекст tx, не означает, что вы можете подключиться с помощью tx. В частности, спецификация требует, чтобы enlistResource выбрасывал RollbackException, если tx помечен только как откат.

  • Тот факт, что контекст присутствует и tx имеет действительное состояние во время его проверки, не означает, что он остается или действителен в течение всего времени жизни вызова метода. Вы можете получить условия гонки, при которых TM вызывает откат ресурсов, пока ваша бизнес-логика все еще работает.

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

  • Синхронизация не требуется. Это также не обязательно желательно, так как синхронизация изменчива, поэтому ваша очистка не будет вызвана в ситуациях аварийного восстановления. Лучше очистить коммит / откат в неэвристических случаях.

...