1

サービス クラスが複数のデータ アクセス オブジェクトを必要とする完全なトランザクションを実現するにはどうすればよいですか。私は次の構造を持っていると仮定します。

現在、dao2 が失敗した場合、dao1 はまだデータベースにコミットされていますが、これは望ましくありません。ただし、DAO を再利用可能にする必要があります。

public class mainService(){
  dao1.store(obj1);
  dao2.store(obj2);
}

そして、私のダオはこのように書かれています。

ダオ 1

private EntityManager entityManager;
@Transactional
public void store(Object obj1){
  entityManager.persist(obj1);
}

ダオ 2

private EntityManager entityManager;
@Transactional
public void store(Object obj2){
  entityManager.persist(obj2);
}

助けてください。

4

3 に答える 3

3

これを 1 回のトランザクションで実現します。

@Transactional
public void mainService(..){
  dao1.store(obj1);
  dao2.store(obj2);
}

トランザクションは 1 つだけ作成され、dao2 が失敗すると、dao1 もコミットされません。@Transactionalメソッドから削除しstoreます。DB レベルのメソッドをトランザクション化するのは得策ではありません。場合によっては、このレベルが 2 つ低くなることがあります。

于 2013-08-15T08:53:41.703 に答える
0

あなたの場合、mainService() も @Transactional でマークする必要があります。トランザクションの伝播ルールはデフォルトで PROPAGATION_REQUIRED であり、dao1.store() と dao2.store() の両方が同じトランザクションの下にあります。dao1 を保持しても問題ありません。 .store() および dao2.store() @Transactional を使用すると、既にトランザクションがあることがわかり、トランザクションに参加します。

于 2013-08-15T08:56:11.717 に答える
0

明らかな答えは、次を使用することです。

private EntityManager entityManager;
@Transactional
public void store(Object obj1, Object obj2){
    entityManager.persist(obj1);
    entityManager.persist(obj2);
}

何が起こったのかというと、DAO の使用に夢中になっているということです。DAOは死んだ!EntityManager API を見ると、実際には DAO タイプのインターフェースに非常によく似ていることがわかります。したがって、通常DAOの使用を検討する場合は、直接使用してください。

于 2013-08-15T08:49:44.563 に答える