MySQL 8.0 リファレンスマニュアル


13.3.7 SET TRANSACTION ステートメント

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 COMMITTEDREAD 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-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-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 transaction_characteristic グローバル
SET SESSION TRANSACTION transaction_characteristic セッション
SET TRANSACTION transaction_characteristic 次のトランザクションのみ

表 13.10 トランザクション特性の SET 構文

構文 影響を受ける特性スコープ
SET GLOBAL var_name = value グローバル
SET @@GLOBAL.var_name = value グローバル
SET PERSIST var_name = value グローバル
SET @@PERSIST.var_name = value グローバル
SET PERSIST_ONLY var_name = value ランタイムへの影響なし
SET @@PERSIST_ONLY.var_name = value ランタイムへの影響なし
SET SESSION var_name = value セッション
SET @@SESSION.var_name = value セッション
SET var_name = value セッション
SET @@var_name = value 次のトランザクションのみ

実行時にトランザクション特性のグローバル値およびセッション値を確認できます:

SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;

関連キーワード:  ステートメント, トランザクション, CREATE, TABLE, READ, 設定, TRANSACTION, 特性, DROP, セッション