Monday 19 December 2011

SQL and Transaction

一通り理解しているつもりだけど、SQLの個別の状況まではな〜

で、学生に実習させてみるんですが… Perl のは、ちゃんと動いて問題ないんだけど、SQL がどうも妙な動きをする。動かしながらわかったんですが、

start transaction と lock table とかの振る舞いは個々のDBで全然違う。start transaction -> commit なわけだけど、

* SQLite3 start transaction で、select/update で自動的に read/write lock がかかる
* MYSQL select for update で write lock、select lock for share で read lock。
* PosgreSQL select for update で write lock、select for share で read lock。

MYSQL では lock table は「それまでの lcok を解除してから、lock を取得」で、unlock tables は勝手にcommitするので以後 roll back 不可らしい。なので、事実上、lock table は使えないので、select for update を使えってことらしいです。ひどい。

SQLite3 方式が正しい ( two phase lock に自動的になるから ) と思うが、strict two phase lock は performance の問題もあるからなぁ。

lock table では lock はかからなくて、update/select して始めて lock がかかるとかがあるので、動作のチェックも難しい。まったくね。

なので、transaction log を見ようと思ったんですが、transaction log は存在するはずなのだが、mysql ではアクセスできない。どうも、起動時にオプションで --binlog とかつけるらしい。実際、それで Mac OS X では動くんですが…

Windows では、どうするの? 勝手にサーバ上がっているんですが。mysql.ini に書くのでは動かないみたい。何故だ〜 というところで授業の時間が尽きたみたい。後は来年ですね。

No comments: