Неправильное поведение отката во вложенном транзакционном контексте с JTA и DataNucleus
Сначала я объясню свою цель, затем симптомы и настройку среды.
Я работаю над проектом, который должен наконец проверить поведение cumulus4j во вложенном транзакционном контексте. Поэтому я сначала написал тесты без cumulus4j. Тестовый пример прост: два объекта записываются в базу данных. Каждый объект написан в пределах собственной транзакции. Две транзакции являются вложенными. Теперь основная транзакция или вложенная транзакция генерируют исключение, которое должно вызвать откат транзакции. Я ожидаю, что поведение:
(obj1) основной успех tx / (obj2) исключение вложенного tx: obj1 в db, obj2 не в db (obj1) исключение основного tx / (obj2) успех вложенного tx: obj2 не в db, obj2 в db
Но у меня есть:
(obj1) основной успех tx / (obj2) исключение вложенного tx: оба объекта в БД (obj1) основное исключение tx / (obj2) вложенный успех tx: нет объекта в БД
Те же самые тесты работают правильно с простым источником данных и чистым SQL, поэтому я потратил много времени на проверку конфигурации JTA и DN.
Транзакции управляются контейнером, и я следовал инструкциям на сайте DataNucleus. Вложенная транзакция запускается одним компонентом, вызывающим другой, который аннотируется @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW).
Настройка: Весь проект представляет собой проект maven и должен работать при переключении на "все-проект" и вводе "mvn clean install". Тестовые случаи - это интеграционные тесты, которые вызывают методы ejb во встроенном сервере glassfish. 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>
Может кто-нибудь объяснить поведение и дать мне подсказку, какие настройки могут быть неправильными?
С уважением, Ян