3

フォローソースが与えられます:

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

メソッド doA を呼び出すと、NonUniqueResultException がスローされます。メソッド doB を呼び出すと、EntityExistsException がスローされます。作成されたメソッドがアプリケーション内で呼び出され、コンテナ管理トランザクションを使用するときに何が起こるかを説明する 2 つのオプションはどれですか? (2 つ選択):

  • A. メソッドdoB()が呼び出されることはありません。
  • B. 現在のトランザクションは、doA()実行後に続行されます。
  • C. 現在のトランザクションは、doB()実行後に続行されます。
  • doA()D.が呼び出されると、現在のトランザクションにロールバックのマークが付けられます。
  • doB()E.が呼び出されると、現在のトランザクションにロールバックのマークが付けられます。

私の見解では、正解は B,E です。

4

2 に答える 2

5

構文的に正しいバージョンを想定しています。

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

A. PersistenceExceptionを拡張するスローされたNonUniqueResultExceptionがキャッチされ、フローの次のステップはdoB()を呼び出すことであるため、メソッドdoB()が呼び出されることはありません

B. doA()の実行trueになった後も、現在のトランザクションは続行されます。これは、文書化されているように、NonUniqueResultExceptionによってトランザクションがロールバックのマークを付けられないためです。

C. EntityExistsExceptionがアクティブなトランザクションにロールバックのマークを付けるため、doB()の実行がfalseになったも、現在のトランザクションは続行されます

D. doA()が呼び出されると、現在のトランザクションはロールバックのマークが付けられます。これは、クレームBで通知された理由により、falseであり、NonUniqueResultExceptionはトランザクションのロールバックのマークを付けません。

E. doB()が呼び出されたときに、現在のトランザクションはロールバックのマークが付けられますクレームCの理由により、EntityExistsExceptionはトランザクションをロールバックのマークを付けます。

于 2012-07-30T10:31:58.833 に答える
2

「トランザクションとロック」に関する質問ではなく、JPA 例外のセマンティクスに関する質問です。

  • NonUniqueResultException永続コンテキストに損傷を与えないため、ロールバックのために現在のトランザクションをマークする必要はありません

  • EntityExistsExceptionパーシスタンス コンテキストとデータベースの間に重大な矛盾があることを示しているため、現在のトランザクションにロールバックのマークを付けます。

    また、この例外は、コミット中のデータベース制約の失敗によって引き起こされる可能性があることに注意してください。その場合、トランザクションはとにかくロールバックされるため、例外のセマンティクスは、すべてのケースでロールバックを保証する必要があります。

したがって、B,E が正解です。

Javadoc も参照してください: NonUniqueResultException, EntityExistsException.

于 2012-07-30T10:28:52.023 に答える