SQL:1992
トランザクション分離レベルの観点では、InnoDB
デフォルトは REPEATABLE READ
です。InnoDB
は SQL
スタンダードによって説明されている4つの全てのトランザクション分離レベルを提供します。コマンド
ライン上、またはオプション ファイル内で
--transaction-isolation
オプションを利用する事で、全ての接続にデフォルトの分離レベルを設定する事ができます。例えば、オプション
ファイルの [mysqld]
セクション内で次のようにオプションを設定する事ができます:
[mysqld] transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE}
ユーザは SET TRANSACTION
ステートメントを利用して単一セッションや全ての新しい接続の分離レベルを変更する事ができます。その構文は次のようになります:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
--transaction-isolation
オプションのレベル名内にはハイフンがありますが、SET
TRANSACTION
ステートメントには無い事に注意してください。
デフォルト動作は、次の(まだ始まっていない)トランザクションの分離レベルを設定する事です。もし
GLOBAL
キーワードを利用すると、そのステートメントはその時点以降に作成された全ての新しい接続に対して、デフォルトのトランザクション
レベルをグローバルに設定します。(既に存在する接続には設定しません。)これには
SUPER
権限が必要です。SESSION
キーワードの利用は、現在の接続上で今後行われる全てのトランザクションに対して、デフォルト
トランザクション レベルを設定します。
全てのクライアントは自由にセッションの分離レベル(トランザクションの最中だとしても)、または次のトランザクションの分離レベルを変更する事ができます。
次のステートメントを利用して
tx_isolation
システム変数の値を確認する事で、グローバル、またセッション
トランザクションの分離レベルを決定する事ができます:
SELECT @@global.tx_isolation; SELECT @@tx_isolation;
行レベル ロック内では、InnoDB
はネクスト キー
ロックを利用します。これは、インデックス
レコード以外に、InnoDB
が、別のユーザによってインデックス
レコードの直前に挿入される事を防ぐ為に、インデックス
レコードに先行する 「ギャップ」
をロックする事もできるという事を意味します。ネクスト
キー ロックは、インデックス
レコードとその前のギャップをロックするロックを参照します。ギャップ
ロックは、ただ単に、いくつかのインデックス
レコードの前にギャップをロックするだけのロックを参照します。
InnoDB
内の各分離レベルに関する詳細説明は次の物です:
READ UNCOMMITTED
SELECT
ステートメントは非ロックの方法で実行されますが、レコードの以前のバージョンが利用される事もあるでしょう。従って、この分離レベルを利用したこのような読み込みは一貫性がありません。これは
「ダーティ リード」
とも呼ばれます。そうでなければ、この分離レベルは
READ COMMITTED
のように機能します。
READ COMMITTED
若干 Oracle に似ている分離レベル。全ての
SELECT ... FOR UPDATE
と SELECT
... LOCK IN SHARE MODE
ステートメントは、インデックス レコードだけをロックしそれらの前のギャップはロックしませんので、ロックされたレコードの隣に新しいレコードの自由挿入を許容します。
固有検索条件を持つ固有インデックスを利用した
UPDATE
と DELETE
ステートメントは、検出されたインデックス
レコードだけをロックし、その前のギャップはロックしません。
値域タイプの UPDATE
と
DELETE
ステートメント内では、InnoDB
はネクスト キーかギャップ
ロックを設定し、別のユーザからの値域によって変換されたギャップへの挿入をブロックする必要があります。これは、「phantom
rows」 が MySQL
複製と復旧が機能する為にブロックされなければいけない為必要になります。
一貫した読み取りは、Oracle 内と同じように機能します:同じトランザクション内でも、各一貫した読み取りはそれ自体の新鮮なスナップショットを設定し、読み取ります。詳しくは 項13.5.10.4. 「一貫非ロック読み取り」 を参照してください。
REPEATABLE READ
これは InnoDB
のデフォルト分離レベルです。固有検索条件を持つ固有インデックスを利用する
SELECT ... FOR UPDATE
、SELECT
... LOCK IN SHARE
MODE
、UPDATE
、そして
DELETE
ステートメントは、前にあるギャップではなく、検索したインデックス
レコードのみをロックします。その他の検索条件を利用して、これらの操作はネクスト
キーかギャップ
ロックでインデックス範囲をスキャンしながらネクスト
キー
ロックを採用し、別のユーザによる新しい挿入をブロックします。
一貫した読み取りの中に、READ
COMMITTED
分離レベルとの重要な違いがあります:同一トランザクション内の全ての一貫した読み取りは、最初の読み取りで確立された同じスナップショットを読み取ります。このしきたりは、もし同じトランザクション内でいくつかの単純な
SELECT
ステートメントを発行すると、これらの
SELECT
ステートメントはお互いに対しても一貫性を持つという事を意味します。詳しくは
項13.5.10.4. 「一貫非ロック読み取り」
を参照してください。
SERIALIZABLE
このレベルは REPEATABLE READ
と似ていますが、InnoDB
は暗黙的に全ての単純な SELECT
ステートメントを SELECT ... LOCK IN SHARE
MODE
にコミットします。