3

给出了以下来源:

public void create ()
{
  try {
   doA () {
 } catch (PersistenceException e) {}
   try (doB) ();
 } catch (PersistenceException e) {} 
}

调用方法 doA 将导致抛出 NonUniqueResultException。调用方法 doB 将导致抛出 EntityExistsException。哪两个选项描述了在应用程序中调用创建的方法时会发生什么,使用容器管理的事务?(选择两项):

  • A.doB()永远不会调用方法。
  • doA()B. 当前事务在执行后将继续。
  • C.当前事务执行后将继续doB()
  • D. 当前事务在doA()被调用时会被标记为回滚。
  • E. 当前事务在doB()被调用时会被标记为回滚。

在我看来,正确的答案是 B、E。

4

2 回答 2

5

假设语法正确的版本:

public void create() {
    try {
        doA ();
    } catch (PersistenceException e) {}
    try {
        doB();
    } catch (PersistenceException e) {}
}

A. 永远不会调用方法 doB()错误声明,因为抛出 NonUniqueResultException,即扩展 PersistenceException 被捕获,流程中的下一步是调用 doB()。

B. 在 doA() 执行为true后,当前事务将继续,因为如文档所述,NonUniqueResultException不会导致事务被标记为回滚。

C. doB() 执行false后,当前事务将继续执行,因为EntityExistsException将活动事务标记为回滚。

D. 当调用 doA() 时,当前事务将被标记为回滚。由于声明 B 的原因,这是错误的,NonUniqueResultException 不会将事务标记为回滚。

E. 当调用 doB() 为true,当前事务将被标记为回滚,由于声明 C 的原因,EntityExistsException 将事务标记为回滚。

于 2012-07-30T10:31:58.833 回答
2

这不是“关于事务和锁定”的问题,而是关于 JPA 异常语义的问题:

  • NonUniqueResultException不需要将当前事务标记为回滚,因为它不会对持久化上下文造成任何损害

  • EntityExistsException将当前事务标记为回滚,因为它表明持久性上下文和数据库之间存在严重的不一致。

    另请注意,此异常可能是由提交期间的数据库约束失败引起的 - 在这种情况下,事务无论如何都会回滚,因此异常的语义应保证在所有情况下都回滚。

因此,B,E 是正确答案。

另请参阅他们的 Javadocs: NonUniqueResultException, EntityExistsException.

于 2012-07-30T10:28:52.023 回答