mysql:15829
From: ひろ <ひろ <hiro@xxxxxxxxxx>>
Date: Tue, 28 Aug 2012 10:13:57 +0900
Subject: [mysql 15829] Re: mysqlコマンドで最新のデータを参照したい
ひろです。 おはようございます。 私が発行したselectは参照オンリーのselectで、同じselectを同じようなタイミング(裏で実行するプログラムの終了後)に発行しましたが結果が場合により異なるという現象です。 プログラムの作り方を根本的に何か間違えているのかも知れませんが、java、rubyともに同じような現象になってしまうので、作り方の問題ではないようにも思えます。 複数のテーブルへのinsertを一括してコミット、ロールバックできていますので、トランザクション内で処理をしていることは確認済みですが、コミットもしくはロールバックしたことをmysqlコマンドが認識できるまでに数秒〜数10秒程度の遅れが発生することはあるのでしょうか? よろしくお願いします。 2012年8月28日 1:37 Tomohiro 'Tomo-p' KATO <tomop@xxxxxxxxxx>: > こんばんは。かとうです。 > > On 12/08/28 0:31, ひろ wrote: > > 実は「もしかして」と思い、例2のパターンと同じようにcommitを試してみたのですが、 > > 再ログインするまで最新の結果は取れませんでした。 > > そうかと思うと、何もしなくても例1のC3で最新のデータが取れる時もありました。 > > それで途方に暮れてしまった次第です。 > > 一応実験してみました。同内容で何度かやってみましたが、select文に > "LOCK IN SHARE MODE"や"FOR UPDATE" をつけてロックを獲得した場合には、 > commitせずとも更新後の内容を取得していますが、ロックを獲得しない単 > 純なselect文の場合には更新前の内容しか出てきませんでした。 > > > 実験環境: VineSeed + MySQL-5.5.25 > > *実験1: 単純なselect文 > ----------------------------------------------------------------- > mysql> select * from test; > +----+------+ > | id | val | > +----+------+ > | 1 | 100 | > +----+------+ > 1 row in set (0.00 sec) > > > (※) ここで別端末から更新 > > > mysql> select * from test; > +----+------+ > | id | val | > +----+------+ > | 1 | 100 | <--------------------- 変化なし > +----+------+ > 1 row in set (0.00 sec) > > mysql> select * from test; <------------- 念のため再度実行 > +----+------+ > | id | val | > +----+------+ > | 1 | 100 | <--------------------- 変化なし > +----+------+ > 1 row in set (0.01 sec) > > mysql> commit; <--------------------- commitしてみる > Query OK, 0 rows affected (0.00 sec) > > mysql> select * from test; > +----+------+ > | id | val | > +----+------+ > | 1 | 200 | <--------------------- 変化あり > +----+------+ > 1 row in set (0.00 sec) > ----------------------------------------------------------------- > > > *実験2: ロックありselect文を使ってみる > ----------------------------------------------------------------- > mysql> select * from test; > +----+------+ > | id | val | > +----+------+ > | 1 | 200 | > +----+------+ > 1 row in set (0.00 sec) > > > (※) ここで別端末から更新 > > > mysql> select * from test; > +----+------+ > | id | val | > +----+------+ > | 1 | 200 | <--------------------- 変化なし > +----+------+ > 1 row in set (0.00 sec) > > mysql> select * from test for update; <-- ロックありでselectしてみる > +----+------+ > | id | val | > +----+------+ > | 1 | 300 | <--------------------- 変化あり > +----+------+ > 1 row in set (0.00 sec) > > mysql> commit; > Query OK, 0 rows affected (0.00 sec) > ----------------------------------------------------------------- > > > ちょっと古いですが、以下のサイトにトランザクション分離レベルごとの > MySQLの挙動の説明がありましたのでご覧ください。 > > > http://www.y2sunlight.com/ground/?MySQL4.1%2F9.MySQL%A4%CE%BC%C2%B8%B3%2F4.%A5%C8%A5%E9%A5%F3%A5%B6%A5%AF%A5%B7%A5%E7%A5%F3 > -- > __________________________________________________ > _/_/ Tomohiro "Tomo-p" KATO <tomop@xxxxxxxxxx> > _/_/ Team Gedoh Network http://www.teamgedoh.net/ > _/_/ Key fingerprint = A6D8 3981 3575 9F00 EFC3 9C2B F03A 5383 9287 74D9 > >
@ 15820 2012-08-27 11:52 [ひろ <hiro@xxxxxxxxx] mysqlコマンドで最新のデータを参照したい 15822 2012-08-27 18:31 ┗[yoku ts <yoku0825@xx] @ 15823 2012-08-27 19:39 ┗[ひろ <hiro@xxxxxxxxx] 15824 2012-08-27 20:20 ┣[Tomohiro 'Tomo-p' KA] @ 15825 2012-08-27 20:28 ┃┗[ひろ <hiro@xxxxxxxxx] 15826 2012-08-27 20:49 ┃ ┗[Tomohiro 'Tomo-p' KA] @ 15827 2012-08-28 00:31 ┃ ┗[ひろ <hiro@xxxxxxxxx] 15828 2012-08-28 01:37 ┃ ┗[Tomohiro 'Tomo-p' KA] -> @ 15829 2012-08-28 10:13 ┃ ┗[ひろ <hiro@xxxxxxxxx] @ 15830 2012-08-28 11:11 ┃ ┗["Mr. Gimmick" <midri] @ 15831 2012-08-28 11:28 ┃ ┗[ひろ <hiro@xxxxxxxxx] 15832 2012-08-28 21:59 ┗[とみたまさひろ <tomm] @ 15833 2012-08-29 10:59 ┗[ひろ <hiro@xxxxxxxxx] 15835 2012-08-30 09:54 ┗[yoku ts <yoku0825@xx] @ 15836 2012-08-30 11:14 ┗[ひろ <hiro@xxxxxxxxx]