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にしても同じだなぁ。つまり、実行順序とか、不完全なレコードを読んでいるとかいうのは論理レベルではありえなくて、実装レベルで何かが起きているのか。やだなぁ。