2

我有点奇怪,希望有人能解释一下。我正在使用Hibernate 3.6.10Spring Framework 3.1.2.RELEASE

我有一个带有和@Controller注释的方法,我知道这是一件坏事。由于一些乏味的问题,我们现在必须这样做,但这不是真正的问题。所有延迟加载都在控制器/事务中按预期工作。@RequestMapping@Transactional

这些事务方法调用一个@Service也用普通 old 标记的 with 方法@Transactional,它应该将所有内容保存在同一个事务中,这Propagation.REQUIRED是默认设置。到目前为止,一切都很好。

现在这是令人困惑的花絮。该@Service方法抛出一个XyzException扩展RuntimeException,据称将事务标记为仅回滚。按照这种逻辑,正在使用的唯一一个事务应该回滚,并且在事务结束之前不重新抛出的任何尝试处理方法XyzException@Controller的事务都应该导致另一个不太预期RuntimeException的 Hibernate 说由于事务被标记而导致提交操作失败仅回滚。但事实并非如此。

相反,事务回滚并且重定向(使用 POST、重定向、GET)成功发生。没有例外,没有混乱。

So the question is, "What am I doing to make this work as it does?"

我有一个OpenSessionInViewInterceptor被使用的,所以我想也许交易实际上并没有从这个@Controller级别开始。但是,当我删除@Transactional时,延迟加载操作中断了。

- 编辑 -

因此,不管 OSIV 是什么废话,我能够处理该方法的XyzException 内部@Transactional是否有意义?我认为在未重新抛出RuntimeException的方法中处理了 s会导致错误。@Transactional所讨论的@Transactional方法是入口点(即第一个@Transactional调用的方法)是否重要?

4

0 回答 0