Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  SET TRANSACTION Statement

15.3.7 设置事务语句

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章 Innodb事务隔离级别

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

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

如果事务访问模式设置为READ ONLY,对表的更改是禁止的。这可能会使存储引擎能够在写入不允许时进行性能改进。

在只读模式下,仍然可以使用DML语句更改使用TEMPORARY关键字创建的表。使用DDL语句进行的更改是禁止的,就像对永久表一样。

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

您可以将事务特性设置为全局、当前会话或下一个事务:

  • 使用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选项在命令行或选项文件中。该选项的值使用连字符,而不是空格,因此可接受的值是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语句允许使用可选的GLOBALSESSION关键字来设置事务特征在不同的范围级别上。

  • 为将transaction_isolationtransaction_read_only系统变量的值分配给它们的SET语句具有在不同的范围级别上设置这些变量的语法。

以下表格显示了SET TRANSACTION和变量分配语句中设置特征的范围级别。

表15.9 SET TRANSACTION 语法

Syntax Affected Characteristic Scope
SET GLOBAL TRANSACTION transaction_characteristic 全局
SET SESSION TRANSACTION transaction_characteristic 会话
SET TRANSACTION transaction_characteristic 下一个事务

表15.10 SET 语法

Syntax Affected Characteristic Scope
SET GLOBAL var_name = value 全局
SET @@GLOBAL.var_name = value 全局
SET PERSIST var_name = value 全局
SET @@存储.var_name = value 全局
SET 存储_只读 var_name = value 无运行时效果
SET @@存储_只读.var_name = value 无运行时效果
SET 会话 var_name = value 会话
SET @@会话.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;