1

この質問は、私が思う写真で最もよく説明されています。誰かが私を助けてくれることを願っています。ありがとう代替テキスト

4

2 に答える 2

1

すべてのコンテキストを指定したかどうかはわかりませんが、(1)と(2)が同じトランザクション内で実行されている場合、エンティティはL1キャッシュにあると言えます。これは、質問が示唆していることであり、 「行の更新」は、別の永続コンテキスト(ネストされたトランザクション)内で実行されたため表示されません。したがって、refreshデータベースからインスタンスの状態を取得する必要があります。

于 2010-05-01T01:12:11.650 に答える
1

私はPascalに同意します。EJB1からの2つの呼び出しが同じトランザクション内にある場合、(2)は別のトランザクションで実行されたため、(1)によって実行された変更を確認できないことは明らかです(もちろん、妥当なトランザクション分離レベルを想定しています)

1. EJB1 transaction (TX1) starts
2.  EJB1.(1) called
3.   EJB2.update row started => TX1 is suspended and
     a new transaction, TX2, is started
4.   The update is performed
5.   TX2 commits
6.  TX1 is resumed - it can't see changes by TX2 because it's isolated from
    changes performed by other transactions during its "life"
7.  EJB1.(2) invokes EJB2.find row withing the context of TX1 => can't see TX2's changes
8. TX1 commits
于 2010-05-03T21:57:05.473 に答える