У меня есть очень простой сценарий, включающий базу данных и JMS в сервере приложений (Glassfish). Сценарий очень прост:
1. an EJB inserts a row in the database and sends a message.
2. when the message is delivered with an MDB, the row is read and updated.
Проблема состоит в том, что иногда сообщение передается, прежде чем вставка фиксировалась в базе данных. Это на самом деле понятно, если мы рассматриваем 2 протокола фиксации фазы:
1. prepare JMS
2. prepare database
3. commit JMS
4. ( tiny little gap where message can be delivered before insert has been committed)
5. commit database
Я обсудил эту проблему с другими, но ответ всегда был: "Странный, это должно работать из поля".
Мои вопросы затем:
Вот немного больше деталей о моем понимании проблемы:
Эта проблема синхронизации существует, только если участника рассматривают в этом порядке. Если 2 пк рассматривают участников обратного порядка (база данных сначала затем брокер сообщений), который должен быть прекрасным. Проблема случайным образом происходила, но абсолютно восстанавливаемая.
Я не нашел способа управлять порядком участников распределенных транзакций в JTA, JCA и спецификациях JPA ни один в документации Glassfish. Мы могли предположить, что они будут включены в список в распределенную транзакцию согласно порядку, когда они будут использоваться, но с ORM, таким как JPA, трудно знать, когда данные сбрасываются и когда соединение с базой данных действительно используется. Какая-либо идея?
Вы испытываете классическое состояние гонки XA 2-PC. Такое случается в производственных средах.
Мне на ум приходят три вещи.
Weblogic имеет эту LLR оптимизацию, которая позволяет избежать этой проблемы и дает вам все XA гарантии.