Можно ли использовать более одной единицы персистентности в транзакции, не используя XA? - PullRequest
3 голосов
/ 16 мая 2009

Наше приложение должно использовать (только для чтения) пару разных модулей персистентности, указывающих на разные базы данных (также разных, коммерческих поставщиков).

У нас нет бюджета для включения 2pc на одном из них (Sybase). Есть ли способ использовать их в транзакции без необходимости транзакции XA?

Мы используем Websphere 6.1, Sybase 12.5.3, Oracle 10g, Java EE 5 и JPA с Hibernate Entity Manager.

Обновление: Обновление oracle PU обновляется 1 или 2 раза в месяц, PU sybase обновляется очень часто - много раз в день. Изоляция, безусловно, беспокоит последних, согласованность между ними не обязательна.

Ответы [ 2 ]

3 голосов
/ 16 мая 2009

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

Если вы действительно читаете ОБА базы данных и не обновляете ни одну, снова вы можете подумать, что распределенная транзакция и связанная с ней блокировка не нужны. Еще раз, хотя, может быть, нет. В этом сценарии вы также можете получать непоследовательные чтения, если другие приложения обновляют те же базы данных. Это зависит от ваших требований и от других пользователей базы данных.

Я бы предложил чтение по уровням изоляции , чтобы получить представление о блокировке, которая применяется даже во время операций чтения для всех надежных хранилищ, таких как базы данных. Транзакционная блокировка может быть ненужной; например, в этом нет необходимости, если вы имеете дело с данными, которые практически не изменяются (без записи любым приложением ).

Может быть, здесь есть бизнес-решение - договоритесь с вашим поставщиком о снижении цены активации XA и оплатите его. С экономикой вы можете заключить сделку, которую можете себе позволить. Примечание: я удивлен, что вы можете лицензировать базу данных и НЕ получать транзакции. Я не знал, что таким образом можно лицензировать Sybase.

1 голос
/ 03 июня 2009

Atomikos TransactionsEssentials - это бесплатный JTA / XA с открытым исходным кодом и пулами соединений для JDBC (и JMS).

Одной из его функций является добавленная поддержка источников данных не-xa. Если доступно только для чтения (в вашем случае), безопасно и легко использовать наш источник данных не-xa для включения вашей Sybase в транзакцию JTA.

Лучший Guy

...