[MariaDB]トランザクション分離レベル
公開日:2026-01-06
更新日:2026-01-06
更新日:2026-01-06
1. 概要
MySQL のトランザクション分離レベルについてです。
RDBMS の種類によって仕様が異なるので要注意。
RDBMS の種類によって仕様が異なるので要注意。
2. 現在の設定の確認
コマンド
# グローバル
SELECT @@global.transaction_isolation;
# 現在のセッション(今回の接続のみ有効)
SELECT @@session.transaction_isolation;
コマンド
# グローバル
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
# 現在のセッション(今回の接続のみ有効)
SET SESSION transaction_isolation = 'READ-COMMITTED';3. 分離レベル
3.1 REPEATABLE READ(デフォルト)
トランザクションの中で SELECT した場合、最新データではなくスナップショットを見るため、スナップショット作成後は、他のトランザクションの変更による影響を受けない。
スナップショット作成のタイミングは、トランザクション開始時ではなく、最初に SELECT を実行した時のため、最初の SELECT では、他のトランザクションの変更を読み込む可能性がある。
スナップショット作成のタイミングは、トランザクション開始時ではなく、最初に SELECT を実行した時のため、最初の SELECT では、他のトランザクションの変更を読み込む可能性がある。
3.2 READ COMMITTED
トランザクションの中で、他のトランザクションでコミットされたデータを読み込むことができる。
そのため、検索するタイミングによって結果が変わる(ノンリピータブルリード)。
そのため、検索するタイミングによって結果が変わる(ノンリピータブルリード)。
3.3 READ UNCOMMITTED
他のトランザクションのコミットされていないデータを読み込むことができる(ダーティリード)。
これにより、開発環境などで、まだコミットされていないデータを外部から読み込んで確認することができる。
これにより、開発環境などで、まだコミットされていないデータを外部から読み込んで確認することができる。
3.4 SERIALIZABLE
SELECT が自動的に SELECT ~ LOCK IN SHARE MODE 相当となり共有ロック(ネクストキーロック)される。
これにより、他のトランザクションで変更しようとすると、ロックが解除されるまで待機状態となるため、
ノンリピータブルリードやファントムリードが発生しない。
これにより、他のトランザクションで変更しようとすると、ロックが解除されるまで待機状態となるため、
ノンリピータブルリードやファントムリードが発生しない。
4. トランザクションで発生する現象
以下は、MySQL のデフォルトの分離レベル(REPEATABLE READ)では発生しません。
分離レベルを READ COMMITTED や READ UNCOMMITTED にした場合に発生します。
分離レベルを READ COMMITTED や READ UNCOMMITTED にした場合に発生します。
ダーティリード(Dirty Read)
コミットしていない変更内容を、他のトランザクションで読み込めてしまう。
READ UNCOMMITTED の場合のみ発生。
READ UNCOMMITTED の場合のみ発生。
ノンリピータブルリード(Non-repeatable Read)
他のトランザクションの変更により、トランザクション内で同じ条件で検索しても、結果が変わってしまう。
ファントムリード(Phantom Read)
他のトランザクションの変更により、検索した時に行が増減したり、SUM() や COUNT() などの結果が増減してしまう。

