交易和锁定的jpa考试困惑

时间:2012-07-30 09:59:42

标签: java exception jpa-2.0

关注来源:

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

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

  • 甲。永远不会调用方法doB()
  • B中。当前事务将在doA()执行后继续。
  • ℃。当前事务将在doB()执行后继续。
  • d。调用doA()时,当前事务将标记为回滚。
  • 电子。调用doB()时,当前事务将标记为回滚。

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

2 个答案:

答案 0 :(得分:5)

假设语法正确的版本:

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

甲。方法doB()将永远不会被调用 false 声明,因为抛出了NonUniqueResultException,这是被捕获的扩展PersistenceException,而流程中的下一步是调用doB()。

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

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

d。当调用doA()时,当前事务将被标记为回滚这是 false ,因为有理由告诉B,NonUniqueResultException不标记事务以进行回滚。

电子。当doB()被调用 true 时,当前事务将被标记为回滚,因为理由告诉C,EntityExistsException标记事务以进行回滚。

答案 1 :(得分:2)

这不是关于“交易和锁定”的问题,而是关于JPA例外语义的问题:

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

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

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

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

另见他们的Javadocs:NonUniqueResultExceptionEntityExistsException