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 子句。不能在同一个levelSET 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=选项在命令行或选项文件中。该选项的值使用连字符,而不是空格,因此可接受的值是levelREAD-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;