2012-01-27 20 views
2

私はJSFプロジェクトに取り組んでいます。MySql 5.1、JBoss 4.22GAをベースとした私たちの開発で、今日はいくつかの問題があり、誰かが私にそれを理解させてくれることを願っています。2つの同じクエリ間で同じ結果が得られたのはなぜですか?

いくつかの理由で私はテーブルを更新してからこれらの変更を見つけることができるかどうかを確認する必要があります。そのために、以下のようなメソッドを呼び出します。

create table `table` (
    id int, 
    update_date datetime, 
); 

// consider this method as one transaction 
somemethod() { 

    A. select max(update_date) from table where id = 1; 

    B. update table set update_date = now() where id = 1; 

    C. select max(update_date) from table where id = 1; 
} 

なお:

1.we break after A (you know using break point in eclipse) 

2.we execute B from somewhere outside application (which means execute update in something like GUI DB manager) 

3.after B we proceed to execute C (same we did as A) 

、我々はAで行ったように、我々は同じ結果を得ました。しかし、我々は、GUI DBマネージャでその変更を確認することができます。なぜこのようなことが起こったのか、誰にでも分かりますか?助けてくれてありがとう。ありがとうございました!

+0

キャッシュ設定を確認してください。どのようにデータベースに接続していますか? – MrKiane

+0

こんにちは、お返事ありがとうございます。 JDBCを使用してデータベースに接続します。私はキャッシュの設定を見てみるべきですか? – redfoxlee

答えて

6

のMySQLのデフォルトのトランザクション分離レベルは、これはthe manualは、トランザクション分離した場合、それについて

を告げるものです、REPEATABLE READです(私はすでに十分に自分自身を明らかにしてきました願っています。英語こうして私の悪いです)レベルがREPEATABLE READ(デフォルトの レベル)である場合、同じトランザクション内の一貫性のあるすべての読み取りでは、そのトランザクションで最初に読み取られたスナップショットが読み取られます。 は、現在の トランザクションをコミットし、その後に新しいクエリを発行することにより、クエリの最新のスナップショットを取得できます。あなたがトランザクション中に何かを読めば、次は同じトランザクション内の同じデータの読み込み、すべてはあなたが見ている正確に何である同じ結果を返すことを意味します要するに

+0

お返事ありがとうございます。それは本当に私にとって役に立ちます。実際には、小さなカスタマイズでいくつかの行をコピーし、テーブルをロックせずにAとCの間の同じテーブルに戻すことを計画しています。そのため、私たちはその部分の正しいコピーを持っていることを確認する必要があります。現在のトランザクションをコミットすることを選択した場合、ロールバック操作は挿入には向いていませんか?あるいは、別の取引に挿入するだけですか? – redfoxlee