2018 10,27 00:32 |
|
今の現場でデットロックが起きたようで
なんでか、こっちに軽く飛び火 はっきり言って、そういう設計だから、そうなるんだよって話がある 今回起きた原因としては、SELECT FOR UPDATEの部分のようで 詳しくソースを追っていないので、正直原因は分かりません。 ただ、「SELECT FOR UPDATE」という文法を、何も考えずに使うとはまりそうなので 今後のために残す。 (基本、この文法はあまり使わないです、私は) 当然ながら、MyISAMでは利用できない これが、うっかり忘れそう トランザクションの中で利用しないと、SELECT FOR UPDATEをした時に行ロックがかかりません。結果、普通のSELECTと変わらなくなってしまいます。
ちょっと考えれば、当然ですよね。UPDATEするんだもん。 でも、SELECTと記述しているから、トランザクションを忘れることもありそうなので。 一意に取得できないクエリを発行したりすると、ギャップロックやネクストキーロックが発生する(簡単に言うと、特定範囲の行が一気にロックされる)ことがあるようです。 なので、ロックした後は、速やかに情報を更新してコミットする。 SELECT FOR UPDATEをしている時点で、結構更新頻度が高めのテーブルを操作しているはずです。例外発生時などに、きちんとrollback等で後始末をしないと、デッドロックが起こってパフォーマンスが落ちます。 PR |
|
コメント |
コメント投稿 |
|
忍者ブログ [PR] |