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