关注来源:
public void create ()
{
try {
doA () {
} catch (PersistenceException e) {}
try (doB) ();
} catch (PersistenceException e) {}
}
调用方法doA将导致抛出NonUniqueResultException。 调用方法doB将导致抛出EntityExistsException。 有两个选项描述在应用程序中调用创建的方法时会发生什么,使用容器管理的事务? (选择两项):
doB()
。doA()
执行后继续。doB()
执行后继续。doA()
时,当前事务将标记为回滚。doB()
时,当前事务将标记为回滚。在我看来,正确答案是B,E。
答案 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:NonUniqueResultException
,EntityExistsException
。