Java 被jpa关于交易和锁定的考试弄糊涂了

Java 被jpa关于交易和锁定的考试弄糊涂了,java,exception,jpa-2.0,Java,Exception,Jpa 2.0,提供了以下来源: public void create () { try { doA () { } catch (PersistenceException e) {} try (doB) (); } catch (PersistenceException e) {} } 调用方法doA将导致引发UnuniquereSultException。 调用方法doB将导致抛出EntityExistsException。 哪两个选项描述了当在应用程序中调用创建的方法时,使用容器管理

提供了以下来源:

public void create ()
{
  try {
   doA () {
 } catch (PersistenceException e) {}
   try (doB) ();
 } catch (PersistenceException e) {} 
}
调用方法doA将导致引发UnuniquereSultException。 调用方法doB将导致抛出EntityExistsException。 哪两个选项描述了当在应用程序中调用创建的方法时,使用容器管理的事务时会发生什么?(选择两个):

  • A.永远不会调用方法
    doB()
  • B.执行
    doA()
    后,当前事务将继续
  • C.执行
    doB()
    后,当前事务将继续
  • D.调用
    doA()
    时,当前事务将被标记为回滚
  • E.调用
    doB()
    时,当前事务将被标记为回滚
在我看来,正确的答案是B,E.

这不是一个“关于事务和锁定”的问题,而是一个关于JPA例外语义的问题:

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

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

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

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


另请参见他们的Javadocs:,.

假设语法正确的版本:

public void create() {
    try {
        doA ();
    } catch (PersistenceException e) {}
    try {
        doB();
    } catch (PersistenceException e) {}
}
A.方法doB()永远不会被调用是false声明,因为捕获到抛出的ununiqueresultexception,即extends PersistenceException,流中的下一步是调用doB()

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

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

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


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

我认为应该是C。但我不确定。。。