Неправильное поведение отката во вложенном транзакционном контексте с 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>

Может кто-нибудь объяснить поведение и дать мне подсказку, какие настройки могут быть неправильными?

С уважением, Ян

0 ответов

Другие вопросы по тегам