Jakarta ee 在JavaEE中使用多实体管理器回滚

Jakarta ee 在JavaEE中使用多实体管理器回滚,jakarta-ee,jboss,transactions,entitymanager,rollback,Jakarta Ee,Jboss,Transactions,Entitymanager,Rollback,在一个使用JBossApplicationServer7和容器管理事务的web应用程序中,我有两个持久化单元,一个用于Oracle,一个用于PostgreSQL。然后我在一个类中注入两个实体管理器 在此类同时使用这些实体管理器的方法中,当引发导致回滚的运行时异常时,只有Oracle数据将回滚 我做错了什么?查找两阶段事务 您应该为XA事务准备数据库 例如,对于PostgreSQL,将参数设置为10 对于Oracle 9.2/10,授予用户权限: grant select on sys.dba_p

在一个使用JBossApplicationServer7和容器管理事务的web应用程序中,我有两个持久化单元,一个用于Oracle,一个用于PostgreSQL。然后我在一个类中注入两个实体管理器

在此类同时使用这些实体管理器的方法中,当引发导致回滚的运行时异常时,只有Oracle数据将回滚


我做错了什么?

查找两阶段事务

您应该为XA事务准备数据库

例如,对于PostgreSQL,将参数设置为10

对于Oracle 9.2/10,授予用户权限:

grant select on sys.dba_pending_transactions to <user name>;
grant select on sys.pending_trans$ to <user name>;
grant select on sys.dba_2pc_pending to <user name>;
grant execute on sys.dbms_system to <user name>;
将sys.dba_pending_事务上的select授予;
将系统挂起的select_trans$授予;
授予sys.dba_2pc_上的select待定;
将sys.dbms_系统上的execute授予;
您应该在JBoss中创建XA数据源。我的示例(对数据库进行更改)

PostgreSQL:

        <driver name="postgresql-xa" module="org.postgresql">
            <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
        </driver>

            <xa-datasource jndi-name="java:jboss/datasources/MoneyXADS" pool-name="MoneyXADS" enabled="true" use-ccm="false">
                <xa-datasource-property name="ServerName">
                    127.0.0.1
                </xa-datasource-property>
                <xa-datasource-property name="PortNumber">
                    5432
                </xa-datasource-property>
                <xa-datasource-property name="DatabaseName">
                    money
                </xa-datasource-property>
                <driver>postgresql-xa</driver>
                <xa-pool>
                    <is-same-rm-override>false</is-same-rm-override>
                    <interleaving>false</interleaving>
                    <pad-xid>false</pad-xid>
                    <wrap-xa-resource>false</wrap-xa-resource>
                </xa-pool>
                <security>
                    <user-name>wassily</user-name>
                    <password>leontief</password>
                </security>
                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                </validation>
                <statement>
                    <share-prepared-statements>false</share-prepared-statements>
                </statement>
            </xa-datasource>

org.postgresql.xa.PGXADataSource
127.0.0.1
5432
钱
PostgrexA
假的
假的
假的
假的
瓦西里
莱昂蒂夫
假的
假的
假的
甲骨文:

        <driver name="oracle-xa" module="com.oracle.db">
            <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
        </driver>

            <xa-datasource jndi-name="java:jboss/datasources/CACCXADS" pool-name="CACCXADS" enabled="true" use-ccm="false">
                <xa-datasource-property name="URL">
                    jdbc:oracle:thin:@localhost:1521:XE
                </xa-datasource-property>
                <xa-datasource-property name="User">
                    DEV_CACC
                </xa-datasource-property>
                <xa-datasource-property name="Password">
                    DEV_CACC
                </xa-datasource-property>
                <driver>oracle-xa</driver>
                <xa-pool>
                    <is-same-rm-override>false</is-same-rm-override>
                    <interleaving>false</interleaving>
                    <pad-xid>false</pad-xid>
                    <wrap-xa-resource>false</wrap-xa-resource>
                </xa-pool>
                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                </validation>
                <statement>
                    <share-prepared-statements>false</share-prepared-statements>
                </statement>
            </xa-datasource>

oracle.jdbc.xa.client.oraclexadasource
jdbc:oracle:thin:@localhost:1521:XE
德福CACC
德福CACC
甲骨文xa
假的
假的
假的
假的
假的
假的
假的
您需要使用复合持久性单元来连接更多数据库。复合持久性单元包含更多的复合单元成员。一个这样的复合持久性单元成员与每个数据库相关联。所有复合持久化单元成员都连接到一个(完整的)复合持久化单元中。这个复合单元在Java中链接到一个@PersistenceContext。它根据一个XA事务进行操作


在详细的回答中,我解释了如何组合两个持久性单元成员。每个复合持久性单元成员都与不同的数据库连接。您可以使用EclipseLink配置复合持久性单元:。

欢迎使用SO!请发一封邮件给我们帮助。格式,大写谢谢回复,我使用jta交易。你可以通过jta交易吗?是的,你可以。只需设置xa数据源。