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
允许使用可选的GLOBAL
和SESSION
关键字在不同的范围级别设置事务特征。将值分配给
transaction_isolation
和transaction_read_only
系统变量的SET
语句具有在不同的范围级别设置这些变量的语法。
以下表格显示了由每个SET TRANSACTION
和变量赋值语法设置的特征范围级别。
表 15.9 SET TRANSACTION 事务特征语法
语法 | 受影响的特征范围 |
---|---|
SET GLOBAL TRANSACTION |
全局范围 |
SET SESSION TRANSACTION |
会话范围 |
SET TRANSACTION |
仅下一个事务 |
表 15.10 SET 事务特征语法
语法 | 受影响的特征范围 |
---|---|
SET GLOBAL |
全局范围 |
SET @@GLOBAL. |
全局范围 |
SET PERSIST |
全局范围 |
SET @@PERSIST. |
全局范围 |
SET PERSIST_ONLY |
无运行时效果 |
SET @@PERSIST_ONLY. |
无运行时效果 |
SET SESSION |
会话范围 |
SET @@SESSION. |
会话范围 |
SET |
会话范围 |
SET @@ |
仅下一个事务 |
可以检查运行时事务特征的全局值和会话值。
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;