中川と申します。
はじめて投稿します。
MySQLの先輩方、お手柔らかにお願いします。
さて、自動コミットが「OFF」で分離レベルが「REPEATABLE READ」の場合ということですが、SQL文を実行するときの接続ユーザが違ってたりしませんでしょうか?
たとえば、SUPER権限のユーザですと、自動コミットの設定が無効となります。
※以下のサイトの「init_connect」の「ノート」を参照ください。
http://dev.mysql.com/doc/refman/5.1/ja/server-system-variables.html以上です。
Date: Tue, 28 Aug 2012 10:13:57 +0900
From:
hiro@freegw.netSubject: [mysql 15829] Re: mysqlコマンドで最新のデータを参照したい
To:
ml@mysql.gr.jpひろです。
おはようございます。
私が発行したselectは参照オンリーのselectで、同じselectを同じようなタイミング(裏で実行するプログラムの終
燦紂砲鉾圓靴泙靴燭覯未豺腓砲茲螳曚覆襪箸いΩ従櫃任后鹿粡寂蝟昭碣昭蝟昭粡プログラムの作り方を根本的に何か間違えているのかも知れませんが、java、rubyともに同じような現象になってしまうので、作り方の問題ではないようにも思えます。
複数のテーブルへのinsertを一括してコミット、ロールバックできていますので、トランザクション内で処理をしていることは確認済みですが、コミットもしくはロールバックしたことをmysqlコマンドが認識できるまでに数秒~数10秒程度の遅れが発生することはあるのでしょうか?
よろしくお願いします。
2012年8月28日 1:37 Tomohiro 'Tomo-p' KATO
<tomop@teamgedoh.net>:
こんばんは。かとうです。
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@teamgedoh.net>
_/_/ Team Gedoh Network
http://www.teamgedoh.net/
_/_/ Key fingerprint = A6D8 3981 3575 9F00 EFC3 9C2B F03A 5383 9287 74D9