kagamihogeの日記

kagamihogeの日記です。

ロックテーブルでデッドロック回避

更新系の DB 処理でテーブルのロック順序に起因するデッドロックは、クエリ発効の流れをきちんと見直してあげなくちゃいけない。けどまぁ…今回はソースがやたら複雑で解析がキッツイ上にコレにかかりっきりになれる時間が今は無い…ということで、ある人の「ロックテーブル作っちゃおうぜ」という提案に乗ることに。

仕組み自体は至って簡単。まず、テキトーなテーブルを作っておいてテキトーな行を一行作っておく。


INSERT INTO HOGE_LOCK_TABLE (HOGE_ROW) VALUES (1)

で、更新系のトランザクションは下記の SQL を必ず一番最初に実行する。トランザクションは最初に必ず HOGE_LOCK_TABLE に立ち寄ってくださいね、というルールにする感じ。


UPDATE HOGE_LOCK_TABLE SET HOGE_ROW = 1

やっつけな感はあるけど、トランザクションの最初にこいつを入れていくだけでデッドロックは起きなくなった。プログラマーとしては負けかなぁって気はするけど…今はとにかく問題潰す方が先決、ということで納得することにしておく…。

あとは同時実行したときにパフォーマンスがどうなるか…。