Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

15.3.7 set事务语句

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子句。

默认的隔离级别是可重复读。其他允许的值是已提交读未提交读可串行化。有关这些隔离级别的信息,请参见第17.7.2.1节“事务隔离级别”

事务访问模式

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

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

如果事务访问模式设置为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 语法 for 事务特征

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

表 15.10 SET 语法 for 事务特征

Syntax Affected Characteristic Scope
SET GLOBAL var_name = value 全局
SET @@GLOBAL.var_name = value 全局
设置持久 变量名 = 全局
设置@@持久。变量名 = 全局
设置仅持久 变量名 = 无运行时效应
设置@@仅持久。变量名 = 无运行时效应
设置会话 变量名 = 会话
设置@@会话。变量名 = 会话
设置 变量名 = 会话
设置@@变量名 = 仅下一事务

可以在运行时检查事务特征的全局和会话值:

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