山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

DBロックを防止するには

オイシックスでは過去何度もDBロックに

悩まされてきました。

DBロックは本当にやっかいです。

どんなにクラスタ構成になっていても

全滅してしまいます。

トラフィックが少ないうちは多少ロック

しても問題になりませんが

トラフィックが増えるとロックがたまり

システムが全滅するという場合もあります。


ロックをしないための1つの方法は、

シーケンスを使うことです。

これは基本中の基本です。

主キーを連番でつけるとき、max値を取得する

際に、2つのプログラムが同時に取得すると

同じmax値になる可能性があります。

それを防ぐには読み取りロックをかける

必要があります。

しかし、シーケンスは1度払い出した値は

2度と払い出しません。

そのためシーケンスを使えばロックをかけずに

済みます。


もう1つはupdateしないということです。

トラフィックが増えてロックになりやすい

ところはカウンター系のプログラムです。

カウンターをアップデートしたときに

同じトランザクションでなんらかの待ちが

発生してコミットが長い時間されないと

他のカウンターのアップデートはロック

待ちになります。


ではupdateをしない場合はどうすれば

よいかというと、insertにすればよいの

です。

カウンターであれば数値を1足すのでなく

レコードをinsertします。

そうすればアップデートしなくてすみます。

合計数を取るときはsumすればよいですね。

レコード数がどんどん増えてしまうので

一定時間経ったらある程度のレコードを

まとめて合計して1行にしてしまいましょう。

このまとめる処理は1時点で1個しか動かない

ようになっていればロックは不要です。