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
还可以包括可选的GLOBAL
或SESSION
关键字,以指示语句的作用域。
事务隔离级别
要设置事务隔离级别,请使用一个ISOLATION LEVEL
子句。不能在同一个level
SET TRANSACTION
语句中指定多个ISOLATION LEVEL
子句。
默认的隔离级别是REPEATABLE READ
。其他允许的值是READ COMMITTED
、READ UNCOMMITTED
和SERIALIZABLE
。关于这些隔离级别的信息,请参见第17章 Innodb事务隔离级别。
要设置事务访问模式,请使用一个READ WRITE
或READ ONLY
子句。不能在同一个SET TRANSACTION
语句中指定多个访问模式子句。
默认情况下,事务在读/写模式下进行,允许对事务中使用的表进行读写操作。这模式可以使用SET TRANSACTION
语句中的访问模式READ WRITE
指定。
如果事务访问模式设置为READ ONLY
,对表的更改是禁止的。这可能会使存储引擎能够在写入不允许时进行性能改进。
在只读模式下,仍然可以使用DML语句更改使用TEMPORARY
关键字创建的表。使用DDL语句进行的更改是禁止的,就像对永久表一样。
READ WRITE和READ ONLY访问模式也可以在单个事务中使用START TRANSACTION
语句中指定。
您可以将事务特性设置为全局、当前会话或下一个事务:
-
使用
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
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 语法
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL TRANSACTION |
全局 |
SET SESSION TRANSACTION |
会话 |
SET TRANSACTION |
下一个事务 |
表15.10 SET 语法
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL |
全局 |
SET @@GLOBAL. |
全局 |
SET PERSIST |
全局 |
SET @@存储. |
全局 |
SET 存储_只读 |
无运行时效果 |
SET @@存储_只读. |
无运行时效果 |
SET 会话 |
会话 |
SET @@会话. |
会话 |
SET |
会话 |
SET @@ |
下一个事务中 |
可以在运行时检查事务特征的全局和会话值:
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;