JPA с несколькими единицами персистентности и транзакцией JTA

#java #jpa #transactions #osgi

#java #jpa #транзакции #osgi

Вопрос:

У меня есть проект OSGi с несколькими пакетами, содержащими классы моделей JPA, а также соответствующие persistence.xml . Все PU используют JTA в качестве типа транзакции и подключены к одной и той же базе данных (они используют один и тот же источник данных).

При манипулировании объектами я использую разные EntityManagers, и все работает нормально, пока я использую XADataSource. Сейчас я думаю, что, поскольку они используют одну и ту же базу данных и один и тот же менеджер транзакций, транзакции XA не должны быть необходимыми. Хотя, если я переключусь на простой источник данных, я начну видеть несоответствия в случае отката.

Я просмотрел спецификации, но не смог найти ничего, связанного с этим. У кого-нибудь есть указатель, требуются ли транзакции XA как часть такой настройки?

Спасибо, Филипп

Ответ №1:

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

В jta транзакция может охватывать разные соединения, и поэтому она работает.

Комментарии:

1. Спасибо, это звучит разумно. Было бы неплохо увидеть это где-нибудь в официальных спецификациях, документированных. Всегда сложно заставить эти вещи работать в OSGi, поэтому вы никогда не знаете, связано ли это с настройкой или предполагается, что это будет работать таким образом 🙂

2. Тема jpa и jta в OSGi действительно довольно сложная (только частично из-за OSGi). Не уверен, как это улучшить, поскольку есть так много вещей, которые нужно учитывать.