jakarta-ee - java ee中使用多个entitymanager进行回滚

标签 jakarta-ee jboss transactions entitymanager rollback

在具有 JBoss Application Server 7 和容器管理事务的 Web 应用程序中,我有 2 个持久性单元,一个用于 Oracle,一个用于 PostgreSQL。然后我在一个类中注入(inject)两个实体管理器。

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

我做错了什么?

最佳答案

寻找两阶段事务。

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

对于 PostgreSQL 设置参数 max_prepared_transactions例如 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>;

您应该在 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>

甲骨文:

        <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>

关于jakarta-ee - java ee中使用多个entitymanager进行回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28853548/

相关文章:

重启后jboss忽略requires_new

java - 异常: Could not parse query :containsOwn(text)

java - 使用 JPA 查询语言的表大小

windows - JBoss - 导出异常 : Port already in use: 1098

java - 应用程序服务器如何使用 Stateful beans 识别用户

mysql 持有并等待同一个锁

Java - 学习顺序

java - 将 log4j 添加到类路径并仍然得到 java.lang.NoClassDefFoundError

java - 关于在 jBoss 中处理多个 ear 部署的建议

entity-framework - 仅 EntityFramework 中的事务不匹配