SELECT FOR UPDATEを利用するときに必ず確認すること

      2016/05/23

SELECT FOR UPDATEを利用するときに気をつけること

当然といえば当然なのですが、気をつけないといけないことを書いておきます。最近、死にかけました。CakePHPでSELECT FOR UPDATEを利用する方法はこちらでも紹介しています。

■MyISAMでは利用できない

当然といえば、当然です。他人の作ったDBとかだと、稀にMyISAMが混ざっていたりしてハマる時があります。引き継いだときに一度確認しておきましょう。

■SELECT FOR UPDATEをトランザクションの中で実行する

トランザクションの中で利用しないと、SELECT FOR UPDATEをした時に行ロックがかかりません。結果、普通のSELECTと変わらなくなってしまいます。SELECT FOR UPDATEでクエリを発行しているのに、思ったように動かないという時にはチェックしてみてください。

■SELECT後は速やかに更新してcommitする

一意に取得できないクエリを発行したりすると、ギャップロックやネクストキーロックが発生する(簡単に言うと、特定範囲の行が一気にロックされる)ことがあります。ロック後速やかに情報を更新してコミットすると良いことが多いです。このあたりはシステム次第ですが、ロックしっぱなしというのは、パフォーマンス的にあんまり良くないと思います。

■rollback等の後始末を必ずする

必ずしましょう。SELECT FOR UPDATEをしている時点で、結構更新頻度が高めのテーブルを操作しているはずです。例外発生時などに、きちんとrollback等で後始末をしないと、デッドロックが起こってパフォーマンスが落ちます。

 

基本中の基本かもしれないですが、他人からプログラムを引き継いだ時とかにハマるかもです。気をつけましょう。では。

megane

megane

最近、個人事業主から法人へと進化しました。 エンジニア歴13年位です。PHPとかMysqlを使ってWebシステムを構築します。 Javaも書きます。 CakePHPも使います。 サーバのチューニングもごりごりやります。 あと、お肉と自動車が好きです。Twitterとか申請どうぞ。

 - mysql ,