1. SET [GLOBAL | SESSION] TRANSACTION
  2. transaction_characteristic [, transaction_characteristic] ...
  3. transaction_characteristic: {
  4. ISOLATION LEVEL level
  5. | access_mode
  6. }
  7. level: {
  8. REPEATABLE READ
  9. | READ COMMITTED
  10. | READ UNCOMMITTED
  11. | SERIALIZABLE
  12. }
  13. access_mode: {
  14. READ WRITE
  15. | READ ONLY
  16. }

此语句指定事务特征。它采用一个或多个用逗号分隔的特征值的列表。每个特征值设置事务隔离级别或访问模式。隔离级别用于 InnoDB 表上的操作。访问模式指定事务是在读/写还是只读模式下运行。
此外, SET TRANSACTION可以包括一个可选的GLOBALSESSION关键字来指示语句的范围。

事务隔离级别

要设置事务隔离级别,请使用隔离级别level子句。不允许在同一SET TRANSACTION语句中指定多个隔离级别子句。
默认的隔离级别为 REPEATABLE READ. 其他隔离级别READ COMMITTED, READ UNCOMMITTED, 和 SERIALIZABLE. 更对关于隔离级别的信息参见Section 14.7.2.1, “Transaction Isolation Levels”https://www.yuque.com/kylinxiang/mysql/isolation-level

事务访问模式

要设置事务访问模式,请使用读写或只读子句。不允许在同一 SET 事务语句中指定多个访问模式子句。
默认情况下,事务以读/写模式进行,允许对事务中使用的表进行读和写操作。可以使用具有读写访问模式的设置事务显式指定此模式。
如果事务访问模式设置为READ ONLY,则禁止更改表。这可能使存储引擎能够在不允许写入时实现性能提升。
在只读模式下,仍然可以使用 DML 语句更改使用临时关键字创建的表。不允许使用 DDL 语句进行更改,就像使用永久表一样。
也可以使用START TRANSACTION 语句为单个事务指定读写和只读访问模式。

事务特征范围

您只能为当前会话或下一个事务设置全局事务特征:

  • 使用 GLOBAL关键字:
    • 该语句适用于所有后续会话。
    • 现有会话不受影响。
  • 使用SESSION关键字:
    • 该语句适用于当前会话中执行的所有后续事务。
    • 该语句在事务中是允许的,但不影响当前正在进行的事务。
    • 如果在事务之间执行,则该语句将覆盖任意设置下一个事务命名特征值的前面的语句(也就是直到下一个设置事务特征范围的语句)。
  • 不含任何SESSION或者GLOBAL关键字:
    • 该语句仅适用于会话中执行的下一个事务。
    • 后续事务恢复为使用命名特征的会话值。
    • 事务中不允许使用该语句: ```sql 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`权限。任何会话都可以自由地更改其会话特征 (即使在事务的中间),或其下一个事务的特征 (在该事务开始之前)。<br />要在服务器启动时设置全局隔离级别,请在命令行或选项文件中使用 `--transaction-isolation=level` 选项。此选项的级别值使用破折号而不是空格,因此允许的值为 `READ-UNCOMMITTED`, `READ-COMMITTED`, `REPEATABLE-READ`, 或 `SERIALIZABLE`。<br />同样,要在服务器启动时设置全局事务访问模式,请使用`--transaction-read-only`选项。默认值为 `OFF` (读/写模式),但对于只读模式,该值可以设置为 `ON`。<br />例如,要将隔离级别设置为 `REPEATABLE READ`,将访问模式设置为`READ WRITE`,请在选项文件的`[mysqld]`部分中使用以下行:
```sql
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF

在运行时,全局、会话和下一个事务范围级别的特征可以使用 SET TRANSACTION语句间接设置,如前所述。还可以使用 set 语句直接设置transaction_isolationtransaction_read_only系统变量:

  • SET TRANSACTION允许在不同范围级别设置事务特征的可选GLOBALSESSION关键字。
  • 用于为 transaction_isolationtransaction_read_only 系统变量分配值的 SET 语句具有用于在不同范围级别设置这些变量的语法。

下表显示了由每个 SET TRANSACTION和变量赋值语法设置的特征范围级别。
SET TRANSACTION Syntax for Transaction Characteristics

Syntax Affected Characteristic Scope
SET GLOBAL TRANSACTION _transactioncharacteristic`` Global
SET SESSION TRANSACTION _transactioncharacteristic`` Session
SET TRANSACTION _transactioncharacteristic`` Next transaction only

SET Syntax for Transaction Characteristics

Syntax Affected Characteristic Scope
SET GLOBAL _varname` = value` Global
SET @@GLOBAL._varname` = value` Global
SET SESSION _varname` = value` Session
SET @@SESSION._varname` = value` Session
SET _varname` = value` Session
SET @@_varname` = value` Next transaction only

可以在运行时检查事务特性的GLOBAL值和SESSION值:

SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;

Prior to MySQL 5.7.20, use tx_isolation and tx_read_only rather than transaction_isolation and transaction_read_only.