在具有 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/