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://dev.mysql.com/doc/refman/5.1/en/create-table.html に
To make MySQL compatible with some ODBC applications, you can find the AUTO_INCREMENT value for the last inserted row with the following query:
SELECT * FROM tbl_name WHERE auto_col IS NULL
の記述がありました。それ以上は分かりませんが、SELECT last_insert_id(); を件のSELECTの前後で実行してみると値が変わったりあるので、それなりに何かしているの様です。AUTO_INCREMENTがあれば他のテーブルにでもできちゃったり。
よくわからない理由により、コメントが即座には反映されないかもしれませんか゛、ボタンを押して元の画面に戻ってきたならたぶん正しく送信されています。
むー。FAQなんかを調べたり、ググったりしたけどよく分からない。そろそろRubyKaigiの準備に移らないとまずいからいったん中断して、あとでもう少し調べてみる。それでも分からなかったらMLで聞いてみよう。