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
ISOLATION LEVEL
SET
TRANSACTION
默认隔离级别为
REPEATABLE READ
. 其他允许的值是READ
COMMITTED
、READ
UNCOMMITTED
和
SERIALIZABLE
。有关这些隔离级别的信息,请参阅
第 14.7.2.1 节,“事务隔离级别”。
要设置事务访问模式,请使用READ
WRITE
orREAD ONLY
子句。不允许在同一SET TRANSACTION
语句中指定多个访问模式子句。
默认情况下,事务以读/写模式进行,允许对事务中使用的表进行读取和写入。可以使用
SET TRANSACTION
访问模式显式指定此模式READ WRITE
。
如果事务访问模式设置为READ
ONLY
,则禁止更改表。这可能使存储引擎能够在不允许写入时进行性能改进。
在只读模式下,仍然可以TEMPORARY
使用 DML 语句更改使用关键字创建的表。不允许使用 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
对全局事务特征的更改需要
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
关键字。SET
为transaction_isolation
和 系统变量赋值 的 语句transaction_read_only
具有在不同范围级别设置这些变量的语法。
下表显示了每个SET TRANSACTION
语法和变量赋值语法设置的特征范围级别。
表 13.6 事务特征的 SET TRANSACTION 语法
句法 | 受影响的特性范围 |
---|---|
SET GLOBAL TRANSACTION
|
全球的 |
SET SESSION TRANSACTION
|
会议 |
SET TRANSACTION
|
仅下一次交易 |
表 13.7 事务特征的 SET 语法
句法 | 受影响的特性范围 |
---|---|
SET GLOBAL |
全球的 |
SET @@GLOBAL. |
全球的 |
SET SESSION |
会议 |
SET @@SESSION. |
会议 |
SET |
会议 |
SET @@ |
仅下一次交易 |
可以在运行时检查事务特征的全局值和会话值:
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
在 MySQL 5.7.20 之前,使用
tx_isolation
and
tx_read_only
而不是
transaction_isolation
and
transaction_read_only
。