行レベルロックが本当に必要な時のみ。
InnoDB を利用し、トランザクション処理を行う場合、MyISAM にはないエラー処理が必要になったり、対処事項が増えたり、MyISAM よりパフォーマンスに劣る面があるという点に留意すること。
InnoDB を利用しなくても済むような、以下の代替手段が存在する。
– サブクエリ
UPDATE user SET presence = 1 WHERE
job_id = (SELECT id FROM job WHERE name = ‘teacher’);
虎の子で条件分岐も使えるし、サブクエリだけで結構何でもできてしまう。
– LOCK TABLES, UNLOCK TABLES]
今日のエントリを参照。
– LAST_INSERT_ID()
最後に挿入したレコードの一意な ID はどのように取得するのか
mysql_insert_id()
最後の挿入(INSERT),更新(UPDATE) で設定/生成されたレコードについての AUTO_INCREMENT 値が入る。AUTO_INCREMENT 値が更新/設定されなかった場合は 0 になる。
– GET_LOCK(), RELEASE_LOCK()
Java や C# のオブジェクト指定のロックのような、名前指定のロック。
ただしデッドロックを避けるため同時に複数のロックを獲得することはできないようになっている。つまり、GET_LOCK() は、前回のGET_LOCK() によるロックを開放する。
参考:
– 釣ったよ!釣りとコンピュータ: MySQL InnoDB のトランザクション