文档首页
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 可以包含可选的GLOBALSESSION 关键字,以指示语句的作用域。

事务隔离级别

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

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

事务访问模式

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

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

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

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

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

事务特征范围

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

  • 使用 GLOBAL 关键字

    • 该语句对所有后续会话全局生效。

    • 现有会话不受影响。

  • 使用 SESSION 关键字

    • 该语句适用于当前会话中执行的所有后续事务。

    • 该语句允许在事务中执行,但不会影响当前正在进行的事务。

    • 如果在事务之间执行,则该语句将覆盖任何先前设置了命名特征的下一个事务值的语句。

  • 没有任何 SESSIONGLOBAL 关键字

    • 该语句仅适用于会话中执行的下一个单个事务。

    • 后续事务将恢复使用会话中命名特征的会话值。

    • 该语句不允许在事务中执行

      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-READSERIALIZABLE

类似地,要在服务器启动时设置全局事务访问模式,请使用 --transaction-read-only 选项。默认值为 OFF(读写模式),但可以将其设置为 ON 以启用只读模式。

例如,要将隔离级别设置为 REPEATABLE READ 并将访问模式设置为 READ WRITE,请在选项文件的 [mysqld] 部分中使用以下行

[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF

在运行时,可以使用 SET TRANSACTION 语句(如前所述)以间接方式设置全局、会话和下一个事务范围级别的特征。还可以使用 SET 语句将值分配给 transaction_isolationtransaction_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;