世界線航跡蔵

Mad web programmerのYuguiが技術ネタや日々のあれこれをお送りします。

2006年06月02日

MySQLが不適当なレコードを返す問題。

Active Recordから変なレコードが返ってくるのは、Active Recordの問題かと思ったらMySQLの問題だった。Active Recordよ、疑って済まなかった。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11 to server version: 5.0.18-Debian_8bpo1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> describe users;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI |         | auto_increment |
| name  | varchar(255) | YES  |     |         |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> INSERT INTO users(name) VALUES('test');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM users WHERE id IS NULL LIMIT 1;
+----+------+
| id | name |
+----+------+
| 1  | test |
+----+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM users WHERE id IS NULL LIMIT 1;
Empty set (0.00 sec)

このreadがrepeatableでないってどうよ? なんか、結果が異様過ぎて自分が何かすごく初歩的な所を見落としていないか不安。誰か教えてください。

ストレージエンジンを変えても(MyISAM, InnoDB, BDBを試してみた)同じ。念のための思ってINSERTとSELECTが別のトランザクションに属するようにしても、トランザクションの分離レベルをSERIALIZABLEにしても同じだなぁ。つまり、実行順序とか、不完全なレコードを読んでいるとかいうのは論理レベルではありえなくて、実装レベルで何かが起きているのか。やだなぁ。

トラックバック

http://yugui.jp/articles/446/ping
MySQLで知っておくと良いかもしれない事 (僕は木になりたい。。。)
初めてのRuby この本を買いました。 どうも評判が良いようで、おもわず買ってしまいました。 まだ、読んでないのですが。。。 著者のYuguiさんのブログを読んでいたら、以下のようなエントリーがあり、結構びっくりして、調べた結果をエントリーします。 知っ...

コメント

Yugui (2006年06月02日 23時56分13秒)
<p>むー。FAQなんかを調べたり、ググったりしたけどよく分からない。そろそろRubyKaigiの準備に移らないとまずいからいったん中断して、あとでもう少し調べてみる。それでも分からなかったらMLで聞いてみよう。</p>
hio (2006年06月29日 00時06分25秒)
<p>はじめまして。<br />もう解決しているかもしれませんが、 http://dev.mysql.com/doc/refman/5.1/en/create-table.html に<br />To make MySQL compatible with some ODBC applications, you can find the AUTO_INCREMENT value for the last inserted row with the following query: <br />SELECT * FROM tbl_name WHERE auto_col IS NULL<br />の記述がありました。それ以上は分かりませんが、SELECT last_insert_id(); を件のSELECTの前後で実行してみると値が変わったりあるので、それなりに何かしているの様です。AUTO_INCREMENTがあれば他のテーブルにでもできちゃったり。</p>
blog comments powered by Disqus

ご案内

前の記事
次の記事

タグ一覧

過去ログ

  1. 2016年07月
  2. 2016年01月
  3. 2015年09月
  4. 2015年08月
  5. 過去ログ一覧

フィード

フィードとは

その他

Powered by "rhianolethe" the blog system