ひろです。
ご回答ありがとうございます。

設定を確認したところ、ご指摘の通り REPEATABLE-READ になっておりましたので

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

としたところ、常に最新のデータが読めるようになりました。

そこでふと疑問に思ったのですが、
「最初の読み取りで確立された同じスナップショット」とは
いつの物なのでしょうか?

言葉的にmysqlにログインした時のように思えますが、もしそうならログイン中には
プログラムで作成したデータは見れないはずなのに、見れる時もあるのでログイン時では
ありません。

mysqlでcommitしてみてもプログラムで追加したデータは見れたり見れなかったりします。

現象を再現させるため何度か同じ操作をしてみましたが、データが見れたり見れなかったり
したので、どんな契機で最新データが見れるようになるのか謎です。


あともう一点。

システムの設定値を変更せず、mysqlコマンドだけREAD-COMMITTEDにしたいのですが
毎回コマンドを打つのは面倒です。
mysqlコマンドでログイン後に自動的にコマンドを発行する方法はありますでしょうか?


よろしくお願いします。



2012年8月27日 18:31 yoku ts <yoku0825@gmail.com>:
はじめまして、yokuといいます。

> 現象としてはmysqlにログインした状態でプログラムから作成・更新したデータの最新状態が見れる時と見れない時があるというものです。
トランザクションの分離レベルがREPEATABLE-READになっている為だと思います。

InnoDBのデフォルトのトランザクション分離レベルであるREPEATABLE-READは、
そのトランザクションが開始した時点でCOMMITされていたデータを読み、
トランザクション開始以後に(他のトランザクションから)COMMITされた更新は読み込みません。

トランザクション分離レベルをREAD-COMMITTEDに変更すると意図した動作になると思われます。

http://dev.mysql.com/doc/refman/5.1/ja/innodb-transaction-isolation.html


ts. yoku

2012年8月27日 11:52 ひろ <hiro@freegw.net>:
> お世話になります。
> ひろと申します。
>
> データベースの設定で自動コミットをオフにしているせいなのか、mysqlコマンドの挙動がおかしい時があり困っていますのでアドバイスをお願いします。
>
> 現象としてはmysqlにログインした状態でプログラムから作成・更新したデータの最新状態が見れる時と見れない時があるというものです。
>
> コミットされなければ見れないというのは理解していますのでデータを作成・更新するプログラムでは当然コミットを発行しています。
> プログラムは全く異なるプロジェクトでrubyとjavaで作成していますが、どちらも同じような現象が見られますのでmysqlの設定に問題があるのではないかと考えています。
>
>
> 1.mysqlコマンドでログインし、データを確認する。
> 2.プログラム等でデータを作成・更新する。
> 3.データを確認する。(1の時と同じselect文。更新されている時とされていない時がある)
> 4.ログオフする
> 5.再度mysqlコマンドでログインし、データを確認する。(2のデータが反映される)
>
> 上記で3の時に2の結果を見るにはどうしたら良いのでしょうか?
>
> mysqlのバージョンは以下の通りです。
> # mysql --version
> mysql  Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (x86_64) using
> readline 5.1
>
>
> よろしくお願いします。
>