我有一个 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
}
我的问题如下:
- 如果我在之间的 createParent 方法中抛出运行时异常
em.persist(parent);
并且createChild();
事务回滚(如我所料)并且父级不会持久保存在数据库中。但是,如果在同一点我抛出 MyException (这是一个已检查的异常),则事务提交并且父级被持久化。我在Aries 邮件列表中看到,蓝图声明性事务中声明的(检查的)异常不会触发回滚。有没有办法配置此行为并指定我希望我的异常在抛出时回滚事务? - 如果我在 createChild 方法(之后)中抛出运行时异常,则
em.persist(child);
子项不会持久保存在数据库中,但是父项会持久保存,就好像这两个方法在两个不同的事务中运行一样。这是为什么?createChild 不应该加入由 createParent 启动的事务吗? - 如果我在调用 createChild 之后在 createParent 方法中抛出运行时异常,我会得到与第 2 点相同的行为(即,父对象被持久化,而子对象未被持久化),这让我更加困惑,因为即使我假设 createChild 启动了新事务,那么当在 createParent 中抛出异常时,这不应该回滚。
- 如果在上面的第 2 点和第 3 点中,这两种方法在不同的服务中,那么一切都按预期工作,即。任何方法中抛出的运行时异常都会回滚整个事务。
有人可以解释上述行为吗?