我将首先解释我的目标,然后解释症状,然后解释我的环境设置。
我正在开发一个项目,最终应该在嵌套的事务上下文中测试cumulus4j的行为。因此,我首先编写了没有cumulus4j的测试。测试用例很简单:将两个对象写入数据库。每个对象都在自己的事务中编写。这两个事务是嵌套的。现在,主事务或嵌套事务抛出了一个异常,该异常应该导致事务的回滚。我期望的行为是:
(obj1)主tx成功/(obj2)嵌套tx异常:db中的obj1,obj2不在db中 (obj1)主tx异常/(obj2)嵌套tx成功:obj2不在db中,obj2在db中
但我有:
(obj1)主tx成功/(obj2)嵌套tx异常:db中的两个对象 (obj1)主tx异常/(obj2)嵌套tx成功:db
中没有对象使用纯数据源和纯SQL正确运行相同的测试,因此我花了很多时间检查JTA和DN配置。
交易是容器管理的,我按照DataNucleus website上的说明操作。 嵌套事务由一个bean调用另一个bean启动,该bean使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)注释。
设置: 整个项目是maven project,在切换到“all-project”并输入“mvn clean install”时应该可以正常工作。 测试用例是集成测试,它在嵌入式glassfish服务器中调用ejb的方法。 ejbs将对象存储在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>
任何人都可以解释这种行为并给我一个暗示哪些设置可能有误?
此致 扬