調べたことメモ3

  • ロックの種類

ロックの粒度によりテーブルロック、ページロック(メモリのセグメント)、行ロックの3つに分けることができる。MySQLInnoDBは行ロックを採用している。

2つの異なるトランザクションにおいて、互いにロック解除を待機している状態に陥ってしまうこと。
試しに1万行程度のUPDATE文を発行するSQLbashから2回実行してみた。

start transaction;
update data1 set content=concat('piyo', round(rand()*100, 0)) where id=10;
update data2 set content=concat('piyo', round(rand()*100, 0)) where id=10;
update data1 set content=concat('piyo', round(rand()*100, 0)) where id=10;
update data2 set content=concat('piyo', round(rand()*100, 0)) where id=10;
・
・
・
・
commit;

するとこんな感じでエラーが出た。

ERROR 1205 (HY000) at line 2: Lock wait timeout exceeded; try restarting transaction


デッドロックを避けるためにはデータソースを同じ手順で一方向にしていくのがよいらしい(by はじめてのSQL
tableA→tableB→tableCのように。できる限りtableBとCの間にAを挟んだりしない。









http://dev.mysql.com/doc/refman/4.1/ja/innodb-locks-set.html

-