
あなたはこんな経験、ありませんか?
普段はサクサク動く業務システムが、特定の時間になると、たった数秒で終わるはずのリクエストが、数分も止まってしまう……。
最初は「ネットワークが遅いのかな?」とか「サーバーが重いのかな?」と思いがちですが、実は意外な理由で止まっていることが多いんです。
それはデータベースの「順番待ち」が原因です。
物語で説明してみよう
倉庫を舞台に考えてみましょう。
力持ちくん:大量の入荷作業を担当。毎回何千〜何万の商品を一度に整理するので、作業中は棚をロックして、他の人が勝手に触れないようにします。
素早いくん:出荷作業担当。少量の在庫をサッとチェックして出荷したいだけです。
普段は力持ちくんが忙しくないので、素早いくんは自由に作業できます。
でも、力持ちくんが大量入荷を始めると、多くの棚がロックされます。そのとき素早いくんが来ると……
棚が全部ロック中なので、仕方なく待つしかありません。
これがシステムでいう「突然の遅延」の正体です。
どうやって問題を見つけるのか?
問題を確認するには、データベースの「誰が待っているか」を見ればOKです。
倉庫でいうところの「今誰が列に並んでいる?」をチェックするイメージです。
データベースには待機中のクエリを確認できるツールがあり、そこを見ると、どの処理がロック待ちで止まっているかが一目でわかります。
これで、サーバーやネットワークが遅いのではなく、単純に「順番待ち」が原因だと判明します。
解決策は?
・力持ちくんの作業を分ける(バッチ処理)
・一度に1万件を処理するのではなく、100件や500件ずつに分けて作業する
・小さい作業が終わるたびにロックが解放され、素早いくんも割り込みできる
全体の処理時間は少し長くなるかもしれませんが、出荷作業への影響は最小化できます
・棚に番号をつけて整理(インデックス最適化)
・力持ちくんが商品を探す時間を短くする
・ロックする範囲が小さくなり、他の作業も割り込みやすくなります
・本当にロックが必要か考える(素早いくんが在庫を確認するだけなら、ロックしなくても良い場合があります)
ロックが必要な場合は、「失敗したら少し待って再試行」などの工夫も有効です

まとめ
システムが突然遅くなるのは、サーバーの性能不足ではなく、データベースのロック待ちであることが
非常に多いです。作業を小分けにしたり、棚の整理を工夫したり、ロックの取り方を見直すことで、
大量入荷作業中でも、出荷作業がスムーズに進むようになります。
これで倉庫もシステムも、みんなハッピーです!

