1

XAトランザクションを使用してSQLServer2005でJBoss6、JPA(Hibernate)を使用しています。クエリとストアドプロシージャを実行できますが、特定のストアドプロシージャを独自のトランザクション(一種)で実行しようとしています。つまり、ストアドプロシージャが失敗したりエラーを返したりした場合、ストアドプロシージャによって行われた変更はロールバックする必要がありますが、entityManager.persist()などの他のクエリによって行われた変更はロールバックしないでください。

ストアドプロシージャ自体でBEGINTRANSACTION、ROLLBACKなどを試しましたが、トランザクションが存在しないというJDBCエラーが発生します。

どうすればこれを達成できますか?独自のトランザクションでストアドプロシージャを実行しますか?(方法はわかりません)

助けてくれてありがとう

4

1 に答える 1

1

私自身の質問に答えると、ストアドプロシージャを実行するこのメソッドは、EJBのサブメソッドでしたが、ビジネスインターフェイスの一部ではありませんでした。この場合、(REQUIRES_NEWを使用しても)新しいトランザクションは作成されないようです。間違い。

結局、メソッドを別のEJBに移動し、メソッドに注釈を付けて、 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)を介してSessionContextを取得しました。

@Resource
protected SessionContext ctx;

ctx.setRollbackOnly();外部トランザクションの変更をロールバックせずに、ストアドプロシージャの変更をロールバックする必要があるときに実行します。

これは私にとっては問題なく機能しますが、何か問題が発生した場合は、遠慮なく修正してください。

于 2011-09-16T14:42:16.380 に答える