0

これは簡単な質問かもしれません

私のコードで私はやっています

user = em.find(User,pk);
user.setName("name");
em.flush();

デバッガーを使用したこの flush() ステートメントの後、ブレークポイントの使用を停止します。SQL 開発者ツールを使用して、DB で変更が行われたかどうかを確認します。DB で完了した変更が表示されません。

これは、flush コマンドについて何を意味しますか。

  1. フラッシュによって生成されたSQLはDBに送信されますが、DBではコミットステートメントが来るのを待ってキューに入れられますか? SQLステートメントはまだ適用されていませんか?

修正 1: 私が何をしようとしているのかについて、最初は明確ではなかったのかもしれません。

ノード1でクラスター化されたセットアップがあります。トランザクション1で、いくつかのパラメーターを変更しています。たとえば、ユーザーエンティティの名前を変更し、それらに対してflush()を実行して、DBにアクセスします。トランザクションで発生する必要がある他の多くの操作があるため、まだコミットできません

これと並行して、トランザクション 1 のノード (マシン) 2 でユーザー エンティティを取得しています。このトランザクションでは、ユーザーの最新の名前を確認することが唯一の目的です。これは並行して起こることであり、私がしなければならないことです。分散ノードが最新の変更を確認できるようにする方法を教えてください。

Node 1                                       Node 2 
try{                                      try {
    em.getTransaction.begin                 em.getTransaction.begin
    user = em.find(User,pk);
    System.out.println.(user.getName())
    /* this prints JERRY*/
    user.setName("TOM");
    em.flush();
    ...
    ...                                     user = em.find(User,pk);
                                            System.out.println.(user.getName()) 
                                            /*This should print TOM*/

    ...
    em.commit()                             //no commit in this transaction  
 }  catch (Exception e) {                    } finally {


   //rollback                                 }
} finally {

}
4

2 に答える 2

0

flush() はトランザクションをコミットせず、データベースに書き込むだけです。別のセッションで変更を確認するには、トランザクションをコミットする必要があります。

于 2012-07-09T13:01:08.797 に答える
0

トランザクションがまだコミットされていないことはおそらく正しいので、変更はそれらを永続化したトランザクションの外では見えません。トランザクションの開始と停止に何を使用していますか?

于 2012-07-09T01:00:16.253 に答える