SQL-92 のトランザクション分離レベルに関する
InnoDB
のデフォルトは
REPEATABLE READ
です。 バージョン
4.0.5 より、InnoDB
は SQL-92
標準で記述されている 4
種類のトランザクション分離レベルをすべて提供するようになりました。
my.cnf
の [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}
SQL 構文ではレベル名にハイフンを付けないことに注意してください。
デフォルトの動作として、次の(まだ開始されていない)トランザクションの分離レベルが設定されます。このステートメントに
GLOBAL
キーワードを使用すると、それ以降に作成されるすべての新しい接続(既存の接続は対象外)に対してグローバルにデフォルトのトランザクションレベルが設定されます。
これを行うには、SUPER
特権が必要です。SESSION
キーワードを使用すると、現在の接続で実行されるすべての新しいトランザクションに対してデフォルトのトランザクションレベルが設定されます。どのクライアントも、自由にセッション分離レベル(トランザクションの途中であっても)または次のトランザクションの分離レベルを変更できます。
3.23.50
より前のバージョンでは、InnoDB
テーブルに SET TRANSACTION
が作用しませんでした。4.0.5
より前のバージョンでは、REPEATABLE
READ
と SERIALIZABLE
のみが提供されていました。
グローバルおよびセッションのトランザクション分離レベルは、次のステートメントで確認できます。
SELECT @@global.tx_isolation; SELECT @@tx_isolation;
行レベルロックでは、InnoDB
がネクストキーロックを使用します。
つまり、インデックスレコードに加えてインデックスレコードの前の
``ギャップ''
もロックすることで、他のユーザがそのインデックスレコードの直前に挿入できないようにします。ここでいうネクストキーロックとは、インデックスレコードとその前のギャップをロックするロックのことです。
ギャップロックとは、あるインデックスレコードの前のギャップのみをロックするロックです。
InnoDB
における各分離レベルの詳細は次のとおりです。
READ UNCOMMITTED
``ダーティリード''
とも呼ばれる。ロックを取得しない
SELECT
ステートメントが実行されるため、前のバージョンのレコードが参照されない。
したがって、この分離レベルでは
'一貫した' 読み取りにならない。
それ以外の場合、このレベルは READ
COMMITTED
と同じように機能する。
READ COMMITTED
Oracle
にやや近い分離レベル。 全ての
SELECT ... FOR UPDATE
および
SELECT ... LOCK IN SHARE MODE
ステートメントは、インデックスレコードのみをロックし、その前のギャップはロックしない。したがって、ロックされたレコードの次に新しいレコードを自由に挿入できる。
一意の検索条件でユニークインデックスを使用する
UPDATE
および
DELETE
は、検出したインデックスレコードのみをロックし、その前のギャップはロックしない。
ただし、範囲指定のある
UPDATE
および
DELETE
では、InnoDB
が引き続きネクストキーロックまたはギャップロックを設定し、その範囲でカバーされるギャップへ他のユーザが挿入できないようにする必要がある。これは、MySQL
のレプリケーションおよびリカバリが機能するように、``ファントム(幻像)行''
をブロックしなければならないからである。
一貫性読み取りは、Oracle
と同じように動作する。つまり、一貫性読み取りでは、同じトランザクション内であっても、最新のスナップショットが独自に設定され、読み取られる。
REPEATABLE READ
InnoDB
のデフォルトの分離レベル。 SELECT
... FOR UPDATE
, SELECT ... LOCK IN
SHARE MODE
,
一意の検索条件でユニークインデックスを使用する
UPDATE
および
DELETE
は、検出したインデックスレコードのみをロックし、その前のギャップはロックしない。
それ以外の場合は、これらの操作でネクストキーロック(次のキーでスキャンされるインデックスの範囲をロック)またはギャップロックが使用され、他のユーザによる新たな挿入がブロックされる。
読み取り一貫性には、前の分離レベルとの間に重要な違いがある。このレベルでは、同じトランザクション内のすべての一貫した読み取りが、最初の読み取りで確立されたスナップショットを読み取る。この規則によって、同じトランザクション内で複数の単純な
SELECT
ステートメントを発行した場合に、それらの
SELECT
ステートメントも互いに一貫した状態になる。
SERIALIZABLE
前の分離レベルに似ているが、単純な
SELECT
ステートメントがすべて暗黙的に
SELECT ... LOCK IN SHARE MODE
に変換される。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.