Двухфазная фиксация транзакции в Java EE 5 - PullRequest
2 голосов
/ 23 августа 2011

Я хочу знать, что как я могу сделать двухфазную транзакцию фиксации с помощью Java EE5 ... Я использую EJB с JPA, для которого Hibernate настроен с MySql.Я просто хочу использовать спецификацию JAVA EE для транзакций, не использующих спящий или специфичный для JDBC объект ....

1 Ответ

4 голосов
/ 23 августа 2011

Все, что вам нужно сделать, чтобы убедиться, что транзакции JTA используются для выполнения всей транзакции в JPA, - это указать, что типом единицы измерения постоянства является JTA, и назначить источник данных JTA для использования поставщиком JPA.Ваш файл persistence.xml будет иметь содержимое, подобное следующему:

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <!-- Specifies the type of the entity managers used by the persistence unit,
         as a JTA entity manager -->
    <persistence-unit name="example-pu" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- Specifies a JTA datasource for use by the JPA provider.
             All connections obtained by the JPA provider for this persistence unit
             will be from this datasource -->
        <jta-data-source>jdbc/myDS</jta-data-source>
            ...
    </persistence-unit>
 </persistence>

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

Обратите внимание, что простого указания источника данных JTA недостаточно.Вы должны определить единицу сохранения как единицу, требующую использования менеджеров сущностей JTA, поскольку неопределенное значение для атрибута transaction-type зависит от среды, в которой работает поставщик JPA.Если поставщик работает в среде Java EE, будут созданы JTA менеджеры сущностей, где как RESOURCE_LOCAL менеджеры сущностей будут созданы в среде Java SE.

Также обратите внимание, что если вы укажетеtransaction-type как RESOURCE_LOCAL, затем в среде Java EE провайдер JPA игнорирует значение jta-data-source и вместо этого будет полагаться на значение non-jta-data-source для создания соединений.

...