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
この辺ちゃんと読んだ方がいいのかな。

まぁいいや。