SET [GLOBAL | SESSION] TRANSACTION
transaction_characteristic [, transaction_characteristic] ...
transaction_characteristic: {
ISOLATION LEVEL level
| access_mode
}
level: {
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
access_mode: {
READ WRITE
| READ ONLY
}
このステートメントは、トランザクションの特性を指定します。 これは、カンマで区切られた 1 つ以上の特性値のリストを受け取ります。 各特性値によって、トランザクション isolation level またはアクセスモードが設定されます。 分離レベルは、InnoDB
テーブルに対する操作に使用されます。 アクセスモードでは、トランザクションが読取り/書込みモードと読取り専用モードのどちらで動作するかを指定します。
さらに、SET TRANSACTION
には、ステートメントのスコープを示すオプションの GLOBAL
または SESSION
キーワードを含めることができます。
トランザクション分離レベルを設定するには、ISOLATION LEVEL
句を使用します。 同じ level
SET TRANSACTION
ステートメントで複数の ISOLATION LEVEL
句を指定することはできません。
デフォルトの分離レベルは REPEATABLE READ
です。 許可されるその他の値は、READ COMMITTED
、READ UNCOMMITTED
および SERIALIZABLE
です。 これらの分離レベルの詳細は、セクション15.7.2.1「トランザクション分離レベル」 を参照してください。
トランザクションアクセスモードを設定するには、READ WRITE
または READ ONLY
句を使用します。 同じ SET TRANSACTION
ステートメントで複数のアクセスモード句を指定することはできません。
デフォルトでは、トランザクションは読み取り/書き込みモードで実行され、そのトランザクションで使用されるテーブルに対して読み取りと書き込みの両方が許可されます。 このモードは、READ WRITE
のアクセスモードで SET TRANSACTION
を使用して明示的に指定できます。
トランザクションアクセスモードが READ ONLY
に設定されている場合は、テーブルへの変更が禁止されます。 これにより、書き込みが許可されていない場合に可能になる、ストレージエンジンのパフォーマンス向上が実現される可能性があります。
読み取り専用モードでは、DML ステートメントを使用して TEMPORARY
キーワードで作成されたテーブルは引き続き変更できます。 永続的なテーブルと同様に、DDL ステートメントによって行われる変更は許可されません。
READ WRITE
および READ ONLY
アクセスモードは、START TRANSACTION
ステートメントを使用して個々のトランザクションに対しても指定できます。
トランザクション特性は、グローバルに設定することも、現在のセッションに対して設定することも、次のトランザクションに対してのみ設定することもできます:
-
GLOBAL
キーワードを使用する場合:ステートメントは、後続のすべてのセッションにグローバルに適用されます。
既存のセッションは影響を受けません。
-
SESSION
キーワードを使用する場合:このステートメントは、現行のセッション内で実行される後続のすべてのトランザクションに適用されます。
ステートメントはトランザクション内では許可されますが、現在進行中のトランザクションには影響しません。
トランザクション間で実行された場合、このステートメントは、指定された特性の次のトランザクション値を設定する前述のステートメントをオーバーライドします。
-
SESSION
またはGLOBAL
キーワードを使用しない場合:このステートメントは、セッション内で次に実行される単一のトランザクションにのみ適用されます。
後続のトランザクションは、指定された特性のセッション値を使用するように戻ります。
-
ステートメントはトランザクション内では許可されません:
mysql> START TRANSACTION; Query OK, 0 rows affected (0.02 sec) mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress
グローバルトランザクション特性を変更するには、CONNECTION_ADMIN
権限 (または非推奨の SUPER
権限) が必要です。 任意のセッションで、セッション特性 (トランザクションの途中であっても) または次のトランザクションの特性 (そのトランザクションの開始前) を自由に変更できます。
サーバーの起動時にグローバル分離レベルを設定するには、コマンド行またはオプションファイルで --transaction-isolation=
オプションを使用します。 このオプションの level
level
の値では、スペースではなくダッシュが使用されるため、許可される値は READ-UNCOMMITTED
、READ-COMMITTED
、REPEATABLE-READ
、または SERIALIZABLE
です。
同様に、サーバーの起動時にグローバルトランザクションアクセスモードを設定するには、--transaction-read-only
オプションを使用します。 デフォルトは OFF
(読取り/書込みモード) ですが、読取り専用モードの場合は値を ON
に設定できます。
たとえば、分離レベルを REPEATABLE READ
に、アクセスモードを READ WRITE
に設定するには、オプションファイルの[mysqld]
セクションで次の行を使用します:
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
実行時に、前述のように、グローバル、セッションおよび次のトランザクションスコープレベルの特性を SET TRANSACTION
ステートメントを使用して間接的に設定できます。 また、SET
ステートメントを使用して直接設定し、transaction_isolation
および transaction_read_only
システム変数に値を割り当てることもできます:
SET TRANSACTION
では、様々なスコープレベルでトランザクション特性を設定するために、オプションのGLOBAL
およびSESSION
キーワードを使用できます。transaction_isolation
およびtransaction_read_only
システム変数に値を割り当てるためのSET
ステートメントには、これらの変数を様々なスコープレベルで設定するための構文があります。
次のテーブルに、各 SET TRANSACTION
で設定される特性スコープレベルと変数割当て構文を示します。
表 13.9 トランザクション特性の SET TRANSACTION 構文
構文 | 影響を受ける特性スコープ |
---|---|
SET GLOBAL TRANSACTION |
グローバル |
SET SESSION TRANSACTION |
セッション |
SET TRANSACTION |
次のトランザクションのみ |
表 13.10 トランザクション特性の SET 構文
構文 | 影響を受ける特性スコープ |
---|---|
SET GLOBAL |
グローバル |
SET @@GLOBAL. |
グローバル |
SET PERSIST |
グローバル |
SET @@PERSIST. |
グローバル |
SET PERSIST_ONLY |
ランタイムへの影響なし |
SET @@PERSIST_ONLY. |
ランタイムへの影響なし |
SET SESSION |
セッション |
SET @@SESSION. |
セッション |
SET |
セッション |
SET @@ |
次のトランザクションのみ |
実行時にトランザクション特性のグローバル値およびセッション値を確認できます:
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;