文档首页
MySQL 8.4 参考手册
相关文档 下载本手册

MySQL 8.4 参考手册  /  ...  /  SET TRANSACTION 语句

15.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
}

此语句指定事务特性。它采用一个或多个以逗号分隔的特性值列表。每个特性值都会设置事务的隔离级别或访问模式。隔离级别用于InnoDB 表上的操作。访问模式指定事务是以读/写模式还是只读模式运行。

此外,SET TRANSACTION 可以包含可选的GLOBAL 或SESSION 关键字,以指示语句的作用域。

事务隔离级别

要设置事务隔离级别,请使用ISOLATION LEVEL level 子句。不允许在同一个SET TRANSACTION 语句中指定多个ISOLATION LEVEL 子句。

默认的隔离级别是 REPEATABLE READ。其他允许的值是 READ COMMITTED、READ UNCOMMITTED 和 SERIALIZABLE。有关这些隔离级别的信息,请参阅 第 17.7.2.1 节,“事务隔离级别”。

事务访问模式

要设置事务访问模式,请使用 READ WRITE 或 READ ONLY 子句。不允许在同一个 SET TRANSACTION 语句中指定多个访问模式子句。

默认情况下,事务在读写模式下进行,允许对事务中使用的表进行读写操作。可以使用带有 READ WRITE 访问模式的 SET TRANSACTION 显式指定此模式。

如果将事务访问模式设置为 READ ONLY,则不允许更改表。这可以使存储引擎能够在不允许写入的情况下进行性能改进。

在只读模式下,仍然可以使用 DML 语句更改使用 TEMPORARY 关键字创建的表。与永久表一样,不允许使用 DDL 语句进行更改。

也可以使用 START TRANSACTION 语句为单个事务指定 READ WRITE 和 READ ONLY 访问模式。

事务特征范围

您可以全局设置事务特征,或为当前会话设置,或仅为下一个事务设置

  • 使用 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 和变量赋值语法设置的特征范围级别。

表 15.9 SET TRANSACTION 事务特征语法

语法 受影响的特征范围
SET GLOBAL TRANSACTION transaction_characteristic 全局
SET SESSION TRANSACTION transaction_characteristic 会话
SET TRANSACTION transaction_characteristic 仅下一个事务

表 15.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;