基礎

2 人が同時に書いて修正が消えた (同時実行制御)

定義

同時実行制御 (concurrency control) とは、複数のトランザクションが同時に実行される場合に、それらが直列に実行された時と同等の結果を保証するため、ロック・タイムスタンプ・多版同時実行制御 (MVCC) などの手法によって競合を調停する仕組みである。

事故 — 2 人が別々の行を修正しただけで、片方の修正が消えた

経理担当 A と担当 B は、共有ドライブに置かれた売上 Excel をそれぞれ自分の PC で開いていた。 A が行 45 の金額を ¥98,000 → ¥120,000 に修正して保存。ほぼ同時に B が別の行 88 の顧客名を修正して保存した。 B が上書き保存した時点で B の PC の版には A の修正が含まれておらず、B の保存が売上シート全体を「B の版」で上書きし、A の修正 (行 45) が消えた

週次で月次売上を集計した時、A の修正が反映されておらず、報告値が実際と食い違って初めて発覚した。 これが Lost Update (更新消失)

※ 冒頭の「壊れた Excel」に仕込んだ 同一 ORD-001 が 2 行できる違和感 も、同じ concurrency 系統の事故。 こちらは「A と B がほぼ同時に新規注文を起票し、それぞれ手元で『次の注文ID は ORD-001』と採番して衝突」という別メカニズムだが、 いずれも「他人の並行操作を DBMS が調停してくれない」ことが根本原因。

原因 — Excel には行 / セル単位のロック機構がない

Excel の共有ファイルは、各自が自分の PC でコピーを編集して戻す方式が多い。 このパターンでは、A と B が別々の行を修正しても、後で保存した版が全体を上書きし、先の修正が消える。 「別の行を触っただけなのに他人の変更まで消える」のは、Excel が 「あなたが変更した行だけをトランザクション単位でロックする」細粒度の制御を持たないため。

OneDrive の同時編集や Excel の共有ブックでは、同じセルへの同時編集はLast Write Wins (後勝ち) になる。方式を変えても 「変更したセル (or 行) だけを他人から守る」細粒度制御がない点は共通している。

Lost Update — 2 人が同時に読んで別々に上書き
時間
担当 A
担当 B
t1
売上シートを開く
行 45 = ¥98,000
t2
同じ売上シートを開く
行 45 = ¥98,000
t3
行 45 を修正 → 保存
行 45 = ¥120,000
t4
別の行を修正 → 保存
自分の手元のコピーで上書き
結末
A の修正 (¥120,000) が B の保存で消え、¥98,000 に戻った

解決策 — ロックと分離レベル

1. 悲観ロック — 「触ったら他人を待たせる」

書き換えたい行を最初に SELECT ... FOR UPDATE で明示的にロックする。 他のトランザクションはそのロックが解放されるまで待たされる。

BEGIN;
SELECT amount FROM sales WHERE id = 45 FOR UPDATE;
-- 他のトランザクションはここで待たされる
UPDATE sales SET amount = 120000 WHERE id = 45;
COMMIT;

2. 楽観ロック — 「保存直前にバージョンを確認」

行に version 列を持たせ、UPDATE の WHERE で読んだ時のバージョンを条件に含める。 他人が先に書き換えていたらバージョンが変わっているので UPDATE は 0 行にヒットして失敗、リトライする。

UPDATE sales
   SET amount = 120000, version = version + 1
 WHERE id = 45 AND version = 12;
-- 影響行が 0 なら他人が先に書き換えている → リトライ

3. 分離レベル (Isolation Level) — DBMS の既定挙動

SQL 標準で 4 段階 (READ UNCOMMITTED / READ COMMITTED / REPEATABLE READ / SERIALIZABLE) が定義されている。 PostgreSQL の既定は READ COMMITTED。厳密な整合性が必要な処理では SERIALIZABLE を局所的に使う。

4. MVCC (多版同時実行制御)

PostgreSQL や Oracle は行に「バージョン」を内部で持ち、書き込みが読み取りをブロックしない設計 (MVCC)。 読み取りは常に「トランザクション開始時点のスナップショット」を見るため待ち時間が減る。 ただし書き込み同士の競合と 書き込みスキュー は別途対処が必要。

境界事例

  • 分離レベルは高いほど遅い: SERIALIZABLE は高コスト。競合予測に基づいて必要な範囲だけに絞る
  • デッドロック: 2 つのトランザクションが互いの行をロックし合って進めなくなる状態。 DBMS は片方を検出して自動 ROLLBACK する
  • MVCC でも起こる書き込みスキュー: 「両者ともスナップショットを見て別々に更新したら、直列実行では起こり得ない結果になる」異常。 SERIALIZABLE への昇格や述語ロックで防ぐ

よくある疑問

Q.Lost Update は Excel だけの問題?
A.いいえ、RDB でも分離レベルや設計次第で起こります。RDB は「起こらないようにする手段 (ロック / MVCC / バージョン列)」を提供する点が Excel との違いです。
Q.悲観ロックと楽観ロックはどちらを選ぶべき?
A.競合が頻発する場面は悲観、稀な場面は楽観が向きます。楽観は競合検出時のリトライロジックを実装する必要があります。
Q.分離レベルの 4 段階、実務では何を選ぶ?
A.多くのアプリケーションは READ COMMITTED (PostgreSQL のデフォルト) で十分です。金融系や在庫のような厳密な整合性が必要な処理では SERIALIZABLE を局所的に使います。
Q.MVCC を使えばロックは不要?
A.読み取りは他の書き込みをブロックしなくなりますが、書き込み同士の競合や書き込みスキューは別途対処が必要です。

もっと学びたい方へ(おすすめ書籍)

おすすめ
達人に学ぶDB設計徹底指南書 第2版
ミック

テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。

Amazon で見る →
[改訂3版]内部構造から学ぶPostgreSQL
勝俣智成 ほか

PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。

Amazon で見る →
情報処理教科書 データベーススペシャリスト 2025年版
三好康之

IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。

Amazon で見る →
理論から学ぶデータベース実践入門
奥野幹也

リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。

Amazon で見る →
おすすめ
楽々ERDレッスン (CodeZine BOOKS)
羽生章洋

ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。

Amazon で見る →
達人に学ぶSQL徹底指南書 第2版
ミック

SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。

Amazon で見る →
SQLアンチパターン 第2版
Bill Karwin

実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。

Amazon で見る →

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講