第17回: 分離レベルとロックの考え方 — 同時実行の「幻の不整合」を防ぐ

章: 第4章: データ整合性と運用

同じデータを2人が同時に読んだとき、何が起きているか知っていますか?

トランザクション中にほかのトランザクションが更新したデータを読んでしまう——これがダーティリードやファントムリードと呼ばれる問題です。分離レベルを理解することで、同時実行時に「どの程度の一貫性を保証するか」を意図的に設計できるようになります。

分離レベルとは何か

MySQLのデフォルト分離レベルは REPEATABLE READ です。これはトランザクション開始時点のスナップショットを読み続けるため、他トランザクションの変更が見えません。一方 READ COMMITTED は、常に最新のコミット済みデータを読みます。どちらが良いかは用途によって異なります。

分離レベルの特性比較

分離レベル ダーティリード ノンリピータブルリード ファントムリード 適した用途
READ UNCOMMITTED 起きる 起きる 起きる ほぼ使わない
READ COMMITTED 防げる 起きる 起きる 分析系・参照系
REPEATABLE READ(デフォルト) 防げる 防げる 防げる(InnoDB) 一般的な業務処理
SERIALIZABLE 防げる 防げる 防げる 厳密な金融処理

チェックポイント: まず現在の分離レベルを確認しましょう。SELECT @@transaction_isolation; で確認できます。変更が必要な場合はセッション単位で変更し、グローバル変更は運用への影響を事前に評価してから行いましょう。

コードサンプル


-- 現在の分離レベル確認
SELECT @@transaction_isolation;

-- セッション単位で変更
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

まとめ & 次のステップ

  • 分離レベルを理解すると同時実行時の不整合を意図的に防げます
  • MySQLのデフォルトは REPEATABLE READ で、一般的な用途には適切です
  • READ COMMITTED は最新データを読む必要がある分析系処理に向いています
  • 分離レベルを変えると性能とロック特性も変わるため、セットで確認しましょう
  • まずREPEATABLE READとREAD COMMITTEDの違いから理解を深めると実務に使いやすくなります

次回は 悲観ロックと楽観ロック を学びます。競合更新を防ぐ2つのアプローチを業務特性に合わせて選ぶ方法を整理しましょう。

Related Articles