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子句。
默认的隔离级别是可重复读
。其他允许的值是已提交读
、未提交读
和可串行化
。有关这些隔离级别的信息,请参见第17.7.2.1节“事务隔离级别”。
要设置事务访问模式,请使用READ WRITE或READ ONLY子句。在同一个SET TRANSACTION
语句中,不允许指定多个访问模式子句。
默认情况下,事务在读写模式下进行,允许对事务中使用的表进行读写操作。可以使用SET TRANSACTION
语句显式指定READ WRITE访问模式。
如果事务访问模式设置为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 语法 for 事务特征
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL TRANSACTION |
全局 |
SET SESSION TRANSACTION |
会话 |
SET TRANSACTION |
仅下一个事务 |
表 15.10 SET 语法 for 事务特征
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL |
全局 |
SET @@GLOBAL. |
全局 |
设置持久 |
全局 |
设置@@持久。 |
全局 |
设置仅持久 |
无运行时效应 |
设置@@仅持久。 |
无运行时效应 |
设置会话 |
会话 |
设置@@会话。 |
会话 |
设置 |
会话 |
设置@@ |
仅下一事务 |
可以在运行时检查事务特征的全局和会话值:
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;