Предположим, у нас есть база данных (например, Oracle) и поставщик JMS (например, HornetQ), участвующий в транзакции XA. Сообщение отправляется в очередь JMS, а некоторые данные сохраняются в базе данных в той же распределенной транзакции. После совершения транзакции потребитель сообщения будет считывать сохраненные данные и обрабатывать их в отдельной транзакции.Согласование данных в транзакциях XA
Что касается первой транзакции XA, следующая последовательность событий может быть выполнена с помощью менеджера транзакций (например JBoss)
- подготовки (HornetQ)
- подготовки (Oracle)
- фиксации (HornetQ)
- фиксации (Oracle)
Что произойдет, если сообщение потребитель начинает считывать данные после совершения завершен в HornetQ, но все еще выполняется в Oracle? Будет ли пользователь сообщения читать устаревшие данные?
Вопрос может быть обобщен на любой вид нескольких ресурсов, участвующих в транзакциях XA, то есть есть возможность для небольшого временного окна (когда выполняются фазы фиксации), в котором читатель из другой параллельной транзакции может получить несогласованное состояние (путем считывания данных с одного ресурса и устаревших данных из другого)?
Я бы сказал, что единственный способ для транзакционных ресурсов предотвратить это - заблокировать всех читателей затронутых данных, как только этап подготовки будет завершен до тех пор, пока не будет произведена фиксация. Таким образом, упомянутый выше пример потребитель сообщения будет блокироваться до тех пор, пока данные не будут переданы в базу данных.
Хороший вопрос, это основная проблема с JTA IMO, это не правильно документировано, даже спецификация слишком легка, чтобы описать (как должен) такой сложный механизм. –
Кроме того, это не худший вариант использования, подумайте о случаях, когда у вас есть сбой при фиксации, когда разработчик XAResource не покрывает восстановление. –
Подробные спецификации слишком длинны, чтобы ответить на них, но могут быть найдены в Oracle White Paper [«XA и Oracle контролируются распределенными Сделки»] (http://www.oracle.com/technetwork/products/clustering/overview/distributed -transactions-and-xa-163941.pdf) на стр. 12 в главе «Распределенные транзакции и блокировка базы данных». – ThinkJet