MySqlあれこれ
LispでのDBアクセスを調べようと思ってMySQLにつないだらトランザクションが効いてない。
MySQLでテーブルを作るとデフォルトではMyISAMになって、トランザクションできないらしい。
あちこち調べて拾い読みする。
既存のテーブルをInnoDBに変えるのはこれで。
alter table xxx type=InnoDB;
CreateTableするときに指定するならこんな感じ。
create table tb1 ( id int(5) default '0' not null, data1 varchar(20) not null, data2 varchar(20) not null, primary key (id)) type InnoDB;
既存のテーブルの情報を見るのはこんなの。
mysql>show table status; mysql>show table status; +------+--------+---------+---------... | Name | Engine | Version | Row_form... +------+--------+---------+---------... | tb0 | MyISAM | 10 | Dynamic ... +------+--------+---------+---------... 1 row in set (0.00 sec)
ついでに更新ロックをとるのはFor Updateをつければいみたい。普通だね。
んーー?
http://dev.mysql.com/doc/refman/4.1/ja/innodb-locking-reads.html
ここ読むと共有ロックとるには
LOCK IN SHARE MODEをつけてSELECTしろってかいていある。
ということは普通にSELECTしたらダーティーリードになるの??
端末を二つ開いて。。。
一個目で
mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> update tb0 set data1='いいいいい'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
としといて、2個めでselectしてみる。
mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from tb0; +----+-----------------+-----------------+ | id | data1 | data2 | +----+-----------------+-----------------+ | 0 | かかかかか | いいいいい | +----+-----------------+-----------------+ 1 row in set (0.00 sec)
なるほど。ダーティリードになるというか、Oracleみたいな読み取り一貫性なのか。
http://dev.mysql.com/doc/refman/4.1/ja/innodb.html
この辺ちゃんと読んだ方がいいのかな。
まぁいいや。