13.3.6 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
}
该语句指定transaction个 Feature。它采用由逗号分隔的一个或多个 Feature 值的列 table。每个 Feature 值设置事务isolation level或访问模式。隔离级别用于InnoDBtable 上的操作。访问模式指定事务是以读/写还是只读模式运行。
此外,SET TRANSACTION可以包含可选的GLOBAL
或SESSION
关键字以指示语句的范围。
事务隔离级别
要设置事务隔离级别,请使用ISOLATION LEVEL level
子句。不允许在同一SET TRANSACTION语句中指定多个ISOLATION LEVEL
子句。
默认隔离级别为REPEATABLE READ。其他允许的值为READ COMMITTED,READ UNCOMMITTED和SERIALIZABLE。有关这些隔离级别的信息,请参见第 14.7.2.1 节“事务隔离级别”。
Transaction 访问模式
要设置事务访问模式,请使用READ WRITE
或READ ONLY
子句。不允许在同一SET TRANSACTION语句中指定多个访问模式子句。
默认情况下,事务以读/写模式发生,并且允许对事务中使用的 table 进行读写。可以使用SET TRANSACTION和READ WRITE
的访问模式来明确指定此模式。
如果将事务访问模式设置为READ ONLY
,则禁止更改 table。这可以使存储引擎能够进行性能改进,这在不允许写入的情况下是可能的。
在只读模式下,仍然可以使用 DML 语句更改用TEMPORARY
关键字创建的 table。与永久 table 一样,不允许使用 DDL 语句进行更改。
也可以使用START TRANSACTION语句为单个事务指定READ WRITE
和READ ONLY
访问模式。
TransactionFeature 范围
您可以为当前会话或仅针对下一个事务全局设置事务 Feature:
-
使用
GLOBAL
关键字: -
该声明适用于所有后续会话。
- 现有会话不受影响。
-
使用
SESSION
关键字: -
该声明适用于当前会话中执行的所有后续事务。
-
该语句在事务中是允许的,但不会影响当前正在进行的事务。
-
如果在事务之间执行,则该语句将覆盖设置命名 Feature 的 next-transaction 值的任何在前语句。
-
-
没有任何
SESSION
或GLOBAL
关键字: -
该语句仅适用于会话中执行的下一个单个事务。
-
随后的事务将恢复为使用命名 Feature 的会话值。
-
该声明在 Transaction 中是不允许的:
-
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
更改全局事务 Feature 需要SUPER特权。任何会话都可以自由更改其会话 Feature(即使在事务中间),也可以更改其下一个事务的 Feature(在该事务开始之前)。
要在服务器启动时设置全局隔离级别,请在命令行或选项文件中使用--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语句间接设置全局,会话和下一个事务作用域级别的 Feature。也可以使用SET语句直接设置它们,以将值分配给transaction_isolation和transaction_read_only系统变量:
-
SET TRANSACTION允许使用可选的
GLOBAL
和SESSION
关键字来设置不同范围级别的 TransactionFeature。 -
用于为transaction_isolation和transaction_read_only系统变量分配值的SET语句具有用于在不同作用域级别设置这些变量的语法。
下 table 显示了每种SET TRANSACTION和变量分配语法设置的 Feature 作用域级别。
table13.6TransactionFeature 的 SET TRANSACTION 语法
Syntax | 受影响的 Feature 范围 |
---|---|
SET GLOBAL TRANSACTION transaction_characteristic | Global |
SET SESSION TRANSACTION transaction_characteristic | Session |
SET TRANSACTION transaction_characteristic | 仅下一笔 Transaction |
table13.7TransactionFeature 的 SET 语法
Syntax | 受影响的 Feature 范围 |
---|---|
SET GLOBAL var_name = value | Global |
SET @@GLOBAL.var_name = value | Global |
SET SESSION var_name = value | Session |
SET @@SESSION.var_name = value | Session |
SET var_name = value | Session |
SET @@var_name = value | 仅下一笔 Transaction |
可以在运行时检查事务 Feature 的全局和会话值:
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
在 MySQL 5.7.20 之前,请使用tx_isolation和tx_read_only而不是transaction_isolation和transaction_read_only。