我将首先解释我的目标,然后是症状,然后是我的环境设置。
我正在开发一个项目,该项目最终应该在嵌套事务上下文中测试 cumulus4j 的行为。因此,我首先编写了没有 cumulus4j 的测试。测试用例很简单:将两个对象写入数据库。每个对象都写在自己的事务中。这两个事务是嵌套的。现在无论是主事务还是嵌套事务都会引发异常,这会导致事务回滚。我期望的行为是:
(obj1) 主要交易成功/(obj2) 嵌套交易异常:obj1 在数据库中,obj2 不在数据库中 (obj1) 主要交易异常/(obj2) 嵌套交易成功:obj2 不在数据库中,obj2 在数据库中
但是我有:
(obj1) 主 tx 成功/(obj2) 嵌套 tx 异常:db 中的两个对象 (obj1) 主 tx 异常/(obj2) 嵌套 tx 成功:db 中没有对象
使用纯数据源和纯 SQL 时,相同的测试可以正常运行,因此我花了很多时间检查 JTA 和 DN 配置。
交易是容器管理的,我按照DataNucleus 网站上的说明进行操作。嵌套事务由一个 bean 调用另一个使用 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释的 bean 启动。
设置:整个项目是一个maven 项目,当切换到“all-project”并输入“mvn clean install”时应该可以工作。测试用例是在嵌入式 glassfish 服务器中调用 ejb 方法的集成测试。ejb 将对象存储在 derby 数据库中。datanucleus 的相关设置为:
datanucleus.jtaLocator=custom_jndi
datanucleus.jtaJndiLocation=java:appserver/TransactionManage
javax.jdo.option.TransactionType=JTA
datanucleus.identifierFactory=datanucleus1
datanucleus.storeManagerType=rdbms
javax.jdo.option.ConnectionFactoryName=jdbc/__default
javax.jdo.option.ConnectionFactory2Name=jdbc/__defaultNoXa
domain.xml 中的服务器资源设置为:
<resources>
<jdbc-resource pool-name="DerbyPool" jndi-name="jdbc/__default" />
<jdbc-resource pool-name="DerbyPoolNoXa" jndi-name="jdbc/__defaultNoXa" />
<jdbc-connection-pool name="DerbyPool" datasource-classname="org.apache.derby.jdbc.EmbeddedXADataSource" res-type="javax.sql.XADataSource">
<property value="${com.sun.aas.instanceRoot}/lib/databases/default" name="databaseName" />
<property value=";create=true" name="connectionAttributes" />
</jdbc-connection-pool>
<jdbc-connection-pool name="DerbyPoolNoXa" datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource40" res-type="javax.sql.DataSource">
<property value="${com.sun.aas.instanceRoot}/lib/databases/default" name="databaseName" />
<property value=";create=true" name="connectionAttributes" />
</jdbc-connection-pool>
</resources>
<servers>
<server name="server" config-ref="server-config">
<resource-ref ref="jdbc/__default" />
<resource-ref ref="jdbc/__defaultNoXa" />
</server>
</servers>
谁能解释这种行为并给我提示哪些设置可能是错误的?
问候,扬