У меня есть OSGi сверток, в котором я объявляю обслуживание и впрыснуть в него сделку с планом:отката транзакции в OSGi
<bean id="MyServiceImpl"
class="com.test.impl.MyServiceImpl">
<jpa:context property="em" unitname="mypu" />
<tx:transaction method="*" value="Required" />
</bean>
<service id="MyService" ref="MyServiceImpl" interface="com.test.api.MyService" />
В данной службе у меня есть два метода каждый из которых записывают данные в базы данных, что-то вроде следующего:
public void createParent() throws MyException {
Parent parent = new Parent();
... // Set parent fields
em.persist(parent);
createChild();
// Checks that could throw MyException
}
public void createChild() throws MyException {
Child child = new Child();
... // Set child fields
em.persist(child);
// Checks that could throw MyException
}
Мои проблемы являются следующие:
- Если я бросаю выполнения ех ception в методе createParent между
em.persist(parent);
иcreateChild();
транзакция откатывается (как и следовало ожидать), и родительский элемент не сохраняется в БД. Однако, если в то же самое время я бросаю MyException (это проверенное исключение), транзакция совершается, и родитель сохраняется. Я видел в Aries mailing list, что объявленное (отмеченное) исключение в декларативной транзакции проекта не вызывает откат. Есть ли способ настроить это поведение и указать, что я хочу, чтобы мое исключение откат транзакции при броске? - Если я бросаю исключение во время выполнения в метод createChild (после
em.persist(child);
), то дочерний элемент не сохраняется в базе данных, однако родительский объект сохраняется, как если бы оба метода выполнялись в двух разных транзакциях. Почему это? Не следует создавать соединениеChild в транзакции, запущенной createParent? - Если я вызываю исключение во время выполнения в методе createParent после вызова createChild, я получаю то же поведение, что и в пункте 2 (т. Е. Родительский объект сохраняется, а дочерний объект не сохраняется), что меня еще больше смущает, поскольку, даже если я предполагаю, что createChild запускает новую транзакцию, тогда она не должна откатываться назад, когда исключение создается в createParent.
- Если в пунктах 2 и 3 выше два метода находятся в разных службах, тогда все работает так, как ожидалось, т.е. исключение, выполняемое во время выполнения любого из методов, возвращает всю транзакцию.
Может кто-нибудь объяснить описанное выше поведение?
Не могли бы вы изменить свой исходный вопрос, чтобы включить этот вывод? Я также испытал странное поведение транзакций, и у меня также есть Datasource, а не XADatasource. – ieugen
Поскольку на самом деле это решение проблемы, я предпочел добавить ее в качестве ответа, чтобы люди поняли этот вопрос в будущем. – Christina