コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
トランザクションとは

データベース内部構造:インデックス・トランザクション・分散DB

SQLの書き方ではなく、DBMSの内側を学ぶコースです。RDBとNoSQL、正規化、B-tree、トランザクションとMVCC、クエリプランナ、レプリケーションと分散SQLを通して、性能と整合性の判断根拠を身につけます。

1
データベースの基礎
0. データベースとは8分
1. RDB と NoSQL の違い8分
2. データベースの歴史8分
3. エンティティ関係モデル (ER)8分
4. 主キー・外部キー・候補キー8分
2
正規化
0. 正規化とは何か8分
1. 第1正規形8分
2. 第2正規形8分
3. 第3正規形8分
4. 非正規化のトレードオフ8分
3
インデックスと B-tree
0. インデックスの役割8分
1. B-tree の仕組み8分
2. B+tree(実際の DB 実装)8分
3. ハッシュインデックス8分
4. カバリングインデックス8分
4
トランザクションと ACID
0. トランザクションとは8分
1. ACID 特性8分
2. 分離レベル8分
3. MVCC(マルチバージョン同時実行制御)8分
4. デッドロックと回避8分
5
クエリ最適化
0. クエリプランナの役割8分
1. EXPLAIN の読み方8分
2. Nested Loop / Hash / Merge Join8分
3. インデックスチューニング8分
4. 統計情報とカーディナリティ8分
6
スケーリング
0. レプリケーション8分
1. シャーディング8分
2. CAP 定理8分
3. 結果整合性8分
4. NewSQL と分散 SQL8分

データベース内部構造:インデックス・トランザクション・分散DB

01データベースとは
02RDB と NoSQL の違い
03データベースの歴史
04エンティティ関係モデル (ER)
05主キー・外部キー・候補キー
06正規化とは何か
07第1正規形
08第2正規形
09第3正規形
10非正規化のトレードオフ
11インデックスの役割
12B-tree の仕組み
13B+tree(実際の DB 実装)
14ハッシュインデックス
15カバリングインデックス
16トランザクションとは
17ACID 特性
18分離レベル
19MVCC(マルチバージョン同時実行制御)
20デッドロックと回避
21クエリプランナの役割
22EXPLAIN の読み方
23Nested Loop / Hash / Merge Join
24インデックスチューニング
25統計情報とカーディナリティ
26レプリケーション
27シャーディング
28CAP 定理
29結果整合性
30NewSQL と分散 SQL

データベース内部構造:インデックス・トランザクション・分散DB

トランザクションとは

引いたところで落ちると、お金が消える

Alice の口座から Bob の口座へ 1000 円を移す処理を、2 本の UPDATE で書いたとします。

SQL クエリ

UPDATE accounts SET balance = balance - 1000 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 1000 WHERE name = 'Bob';

1 本目が終わり、2 本目が走る前にサーバのプロセスが落ちたとします。Alice の残高は 1000 円減っていて、Bob の残高は増えていません。1000 円がどこにも存在しない状態で、DB は止まります。

厄介なのは、壊れたデータがエラーの顔をしていないことです。残高はどちらも数値として正しく入っていて、制約にも引っかかりません。誰かが帳尻の合わなさに気づくまで、正常なデータとして残り続けます。落ちる場所も 2 本の間だけではありません。ネットワークが切れた、デプロイで再起動が入った、アプリが例外を投げて途中で戻った。どれでも同じ結果になります。

全部やるか、何もしないかに括る

原因は「2 本のうち片方だけが残った」ことです。逆に言えば、片方だけ残る状態を DB の側で作れなくすれば起きません。それがトランザクションです。

SQL クエリ

BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 1000 WHERE name = 'Bob';
COMMIT;

BEGIN から COMMIT までは、外から見て 1 つの操作です。途中で落ちても、DBMS は再起動時に「COMMIT に届いていない変更」をまとめて巻き戻します。Alice の残高も元に戻り、送金は初めからなかったことになります。半端な状態が残らないので、後から手作業で辻褄を合わせる仕事も発生しません。

自分の判断で取り消すときは ROLLBACK を書きます。アプリ側では、例外を捕まえたら必ず ROLLBACK を通る形にしておきます。

JavaScript

const trx = await db.transaction();
try {
  await trx.query("UPDATE ...");
  await trx.query("UPDATE ...");
  await trx.commit();
} catch (err) {
  await trx.rollback();
  throw err;
}

どこからどこまでを括るか

MySQL も PostgreSQL も、既定では 1 文ごとに自動でコミットされます。BEGIN を書いていないコードは、括っていないのではなく「1 文ずつ括られている」状態です。

括る範囲は、整合性を保つのに必要な最小限にします。外部 API の呼び出しやファイル生成、利用者の入力待ちを内側に入れると、その間ずっと他のトランザクションを待たせることになります。Web アプリでは 1 リクエスト 1 トランザクションが出発点で、そこから広げるかどうかを都度考えます。

解説

短いトランザクションは速くて安全。長いものは事故の元。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • プロセス実行中のプログラムのこと。
  • デプロイ本番環境へアプリを配置し公開する作業
  • トランザクション「全部成功 or 全部なかったことに」をまとめる単位
  • branchGit で開発するときに毎日打つ 5 つの基本コマンド
  • 判断YES/NO 分岐を表す菱形
  • MySQL広く使われるオープンソースのRDBMS
  • PostgreSQL機能が豊富なオープンソースのRDBMS
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • ACID 特性

    Atomicity / Consistency / Isolation / Durability を内部から理解

  • 分離レベル

    Read Uncommitted から Serializable まで 4 段階を比較する

  • MVCC(マルチバージョン同時実行制御)

    読み手をブロックしないバージョン管理の仕組み

  • デッドロックと回避

    複数トランザクションが互いのロックを待ち続けるデッドロックが起きる原理と、DBMS の検出の仕組み、アプリ側で予防する設計原則を実務目線で解説します。

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。