0

私はSpringとHibernateを使用しています。で注釈が付けられたメソッドがあり@Transactionalます。このメソッドには 2 つのデータベース呼び出しがあります。1 回の呼び出しでテーブル内のデータが更新され、もう 1 回の呼び出しで、最初の呼び出しで更新されたデータに基づいて同じテーブルからデータが取得されます。問題は、最初の呼び出しのデータベースの変更がすぐに反映されないことです。でアノテーションを付けたメソッドからフローが出た後に変更が反映され@Transactionalます。私はまだ電話をかけてみsession.flush()ましたが、役に立ちませんでした。私に提案してください。

@Transactional
public void method1(){
dao.updateM1();
dao.getData();
}
4

5 に答える 5

2

シナリオについて詳しく説明していただけますか?例: updateM1およびgetDataメソッドに対してどの伝播レベルを宣言しましたか?

updateM1およびgetDataメソッドのTransactional について説明しなかった場合、問題は両方のメソッドが 1 つの同じトランザクション内にあることです。その結果、Hibernate はトランザクションがコミットされるまでデータを更新しません。この問題を解決するには、updateM1のトランザクションを次のように記述します。

@Transactional (propagation = Propagation.REQUIRE_NEW)
public E updateM1() {}

これにより、 updateM1が呼び出されるたびに新しいトランザクションが作成されます。updateM1 が完了すると、その新しいトランザクションがコミットされ、すべての変更がデータベースに永続化されます。

session.flush が機能しないことについて、明確な答えが 1 つあります: Hibernate session.flush() に関する質問

于 2013-05-09T14:23:22.223 に答える
1

私の知る限り、トランザクションメソッドの完了後、変更のみがデータベースに反映されます。

しかし、ここではメソッドの完了前に呼び出しているため、更新された結果が得られません。

于 2013-05-09T13:30:52.490 に答える
0

私の知る限り、@Transactionメソッドでアノテーションを使用する場合。本体のロジックにおけるデータベースの変更は、メソッド呼び出しの最後にコミットする必要があります。

于 2013-05-09T13:35:32.530 に答える