2016-04-18 19 views
3

トランザクションの概念を実装するために2つのウィンドウを使用しています。コミット後も更新されたデータが表示されない

ウィンドウ1:begin;

ウィンドウ1:update employee set salary = 45000 where ssn = '123456789';

ウィンドウ2:begin;

ウィンドウ2:ここではselect * from employee where ssn = '123456789';

、このコマンドは私に正しい前のデータを示しています。

ウィンドウ1:commit;

ウィンドウ2:ここではselect * from employee where ssn = '123456789';

、私は45000の更新給料を取得する必要があります。しかし、私の窓2は、前のデータを示しています。間違いはどこでやっていますか?

答えて

1

あなたの期待は間違っています、それだけです。お互いの仕事から見える取引は、いわゆるtransaction isolation levelsによって決まります。デフォルトでは、MySQLは意味し、repeatable read isolation levelを使用する:

をトランザクション分離レベルは、REPEATABLE READ(デフォルト レベル)である場合、すべての一致は、同じトランザクション内で読み出しが第1のそのようなリードによって確立 スナップショットを読み取りますトランザクション。 は、現在の トランザクションをコミットし、その後に新しいクエリを発行することにより、クエリの最新のスナップショットを取得できます。

あなたが期待する行動可能にするためにコミット読み取りに分離レベルを変更することができます:トランザクションセット内のREAD COMMITTED分離レベルで

、各読取り一貫性を、独自の新鮮なスナップショットを読み込みます。

+0

ご回答ありがとうございます。しかし、私は、My SQLのDEFAULT TRANSACTION ISOLATION LEVELをグローバルにコミットするように変更する方法を知りたいだけです。 –

+0

設定されたトランザクション構文については、mysqlマニュアルを参照してください。 – Shadow

関連する問題