Help us understand the problem. What is going on with this article?

cron+retry+DBで地獄を見た件。

More than 1 year has passed since last update.

概要

アプリケーションにおいてそこで実装された機能の処理とcronにおいてデータベースの更新をすると、処理がかぶり、デッドロックが起こる場合がある。そうして負けた方のロールバックに巻き込まれてデータに不整合が起こるといった件で地獄を見たので共有。

起こった要因

ロックしている時間が長い

大量のINSERTをする+実行計画がindexである場合など様々スロークエリの状況が揃った場合に起こりやすくなっている。

Insertをした時にretryの処理を入れている(特にcron側)

あまり良くないとわかっていてもシステムを落とさないでしっかり動作させるためにこの処理入れているところもあるのではなかろうか。これが地獄を見た主たる原因。

改善策

  • SQLの実行計画の改善 => 処理の時間を短くすることでかぶる確率を下げる
  • cronの頻度を減らす => 上記に同じ。かぶる確率を下げる
  • retryをしない => 処理を落とさないためにその他施策を打つ必要はある

データがどういうことになってしまったか

アプリ側でINSERTなどをテーブルA, B, Cをロックしているとする。
その後、cron側がテーブルAとテーブルCをJOINしてSELECT->INSERTしに行こうとする。
しかしこの時、アプリ側でDBをロックしているのでROLL BACKが走る。
この時にリトライなどの処理を入れてしまうと、テーブルBのみINSERTされるといった現象が起きてしまう。ただ、INSERTはされているので、アプリの処理の書き方によっては、正常終了とみなされる。

処理 テーブルA テーブルB テーブルC
cronの処理 アクセス不可 アクセス不可
アプリの処理 ロック ロック ロック
SuguruOoki
現在は、TechBowlで主にフロントエンドを描いてる人。 以前は、バックエンドの開発と、データ分析をやっていた。
https://www.wantedly.com/users/17885157
techtrain
プロのエンジニアを目指すU30(30歳以下)の方に現役エンジニアにメンタリングもらえるコミュニティです。
https://techbowl.co.jp/techtrain/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした