2

データベースに情報を作成するいくつかの EJB ファサードを利用する関数があります。このデータ作成呼び出しのブロックはアトミックである必要があり、失敗した場合は何もコミットされません。この呼び出しのブロックをトランザクション対応にするにはどうすればよいですか?

public myFunction() {
    ...
    ...
    userFacade.create(user);
    addressFacade.create(address);
    orderFacade.create(order);
    ...
}
4

2 に答える 2

3

EJB3 で宣言型トランザクション (コンテナー管理トランザクション) を使用する場合は、これらのデータ アクセス呼び出しに次のいずれかのアノテーションを付けます。

@TransactionAttribute(TransactionAttributeType.REQUIRED)

@TransactionAttribute(TransactionAttributeType.MANDATORY)

つまり、これらのメソッドは、現在進行中のトランザクションが存在する場合、そのトランザクションに参加します。(myFunction) も EJB メソッドである場合、指定するREQUIRES_NEWと新しいトランザクションが開始されます。システム例外が発生した場合、トランザクションはロールバックされますが、アプリケーション例外は発生しません。これが、この場合 setRollbackOnly を使用する必要がある理由です。

詳細はこちら: http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html

于 2013-02-15T06:00:02.017 に答える
1

Java EE では、EJB はトランザクションを操作するためのテクノロジであり、デフォルトではすべてのビジネス メソッドはトランザクション対応であり、Bean プロバイダーが変更しない限り@TransactionAttribute(REQUIRED)のアノテーションが付けられます。

したがって、あなたの場合、myFunctionメソッドをビジネスメソッドにすることは非常に有益であり、メソッドに入るとトランザクションが開始され、メソッドを離れるとコミット/ロールバックされます。これらはすべて、EJB コンテナーによって処理されます。例外がスローされると、コンテナーは自動的にトランザクションをロールバックし、その間のすべての操作をロールバックします。

于 2013-02-15T22:04:57.327 に答える