设置事务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 }
该语句指定事务特征。它采用由逗号分隔的一个或多个特征值的列表。每个特征值都设置事务隔离级别或访问模式。隔离级别用于对InnoDB
表进行操作。访问模式指定事务是以读/写还是只读模式运行。
另外,SET TRANSACTION
可以包含可选GLOBAL
或 SESSION
关键字来指示语句的范围。
隔离级别
要设置事务隔离级别,请使用一个ISOLATION LEVEL level子句。不允许在同一SET TRANSACTION
语句中指定多个子句。
默认隔离级别为 REPEATABLE READ
。其他允许值是READ COMMITTED
,READ UNCOMMITTED
和 SERIALIZABLE
。
访问模式
请使用READ WRITE
or READ ONLY
子句。不允许在同SET TRANSACTION
一条语句中指定多个访问模式子句。
默认情况下,事务以读/写模式进行,并且允许对事务中使用的表进行读写。可以使用SET TRANSACTION
的访问模式明确指定此模式 READ WRITE
。
如果事务访问模式设置为READ ONLY
,则禁止更改表。这可以使存储引擎能够进行性能改进,这在不允许写入的情况下是可能的。
在只读模式下,仍然可以使用DML语句更改用关键字TEMPORARY创建的表。与永久表一样,不允许使用DDL语句进行更改。
特征范围
您可以为当前会话或仅针对下一个事务全局设置事务特征:
使用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
更改全局事务特征需要 SUPER
特权。任何会话都可以自由更改其会话特征(即使在事务中间),也可以更改其下一个事务的特征(在该事务开始之前)。
例如,要将隔离级别设置为REPEATABLE READ
,将访问模式设置为READ WRITE
,请在[mysqld]
选项文件的部分中使用以下几 行:
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
Table 13.6 SET TRANSACTION Syntax for Transaction Characteristics
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL TRANSACTION |
Global |
SET SESSION TRANSACTION |
Session |
SET TRANSACTION |
Next transaction only |
Table 13.7 SET Syntax for Transaction Characteristics
Syntax | Affected Characteristic Scope |
---|---|
SET GLOBAL |
Global |
SET @@GLOBAL. |
Global |
SET SESSION |
Session |
SET @@SESSION. |
Session |
SET |
Session |
SET @@ |
Next transaction only |
It is possible to check the global and session values of transaction characteristics at runtime:
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;