調べたことメモ3
- ロックの種類
ロックの粒度によりテーブルロック、ページロック(メモリのセグメント)、行ロックの3つに分けることができる。MySQLのInnoDBは行ロックを採用している。
2つの異なるトランザクションにおいて、互いにロック解除を待機している状態に陥ってしまうこと。
試しに1万行程度のUPDATE文を発行するSQLをbashから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
-