で、学生に実習させてみるんですが… 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:
Post a Comment