Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@SuguruOoki

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

More than 3 years have 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の処理 アクセス不可 アクセス不可
アプリの処理 ロック ロック ロック
1
Help us understand the problem. What is going on with this article?
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
SuguruOoki
現在は、TechBowlで主にフロントエンドを描いてる人。 以前は、バックエンドの開発と、データ分析をやっていた。
techtrain
プロのエンジニアを目指すU30(30歳以下)の方に現役エンジニアにメンタリングもらえるコミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?