読者です 読者をやめる 読者になる 読者になる

MySQLのinnodbでテーブルロックを使う

テーブルロックとトランザクションは排他的にしか使えないと思っていたが*1自動コミットをOFFにするとテーブルロックとトランザクションを同時に使えるらしい。
http://dev.mysql.com/doc/refman/5.1/ja/lock-tables.html

トランザクションとテーブルロックの開始

/* 自動コミットをOFFにする */
SET AUTOCOMMIT=0;

/* テーブルロック */
LOCK TABLES xxx WRITE, xxx AS t READ;

/* 何か色々処理をする */
〜〜〜

処理が成功した場合

/* コミットする */
COMMIT;

/* (COMMITだけだとテーブルロックは解除されないので)アンロックする */
UNLOCK TABLES;

処理がエラーになった場合

/* ロールバックする */
ROLLBACK;

/* アンロックする(先にアンロックすると暗黙的にコミットされるのでこの順番で無ければならない)*/
UNLOCK TABLES;

本当にこれでいいのかどうか余り自身は無い・・・

*1:LOCKすると暗黙的にCOMMITされてしまい、COMMITすると暗黙的にUNLOCKされてしまうから