SET TRANSACTION
SET TRANSACTION
语句可用于在 GLOBAL
或 SESSION
级别更改当前的隔离级别。此语法是 SET transaction_isolation='new-value'
的替代方案,旨在兼容 MySQL 和 SQL 标准。
概要
- SetStmt
- TransactionChars
- IsolationLevel
- AsOfClause
SetStmt ::=
'SET' ( VariableAssignmentList |
'PASSWORD' ('FOR' Username)? '=' PasswordOpt |
( 'GLOBAL'| 'SESSION' )? 'TRANSACTION' TransactionChars |
'CONFIG' ( Identifier | stringLit) ConfigItemName EqOrAssignmentEq SetExpr )
TransactionChars ::=
( 'ISOLATION' 'LEVEL' IsolationLevel | 'READ' 'WRITE' | 'READ' 'ONLY' AsOfClause? )
IsolationLevel ::=
( 'REPEATABLE' 'READ' | 'READ' ( 'COMMITTED' | 'UNCOMMITTED' ) | 'SERIALIZABLE' )
AsOfClause ::=
( 'AS' 'OF' 'TIMESTAMP' Expression)
示例
mysql> SHOW SESSION VARIABLES LIKE 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SESSION VARIABLES LIKE 'transaction_isolation';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+
1 row in set (0.01 sec)
mysql> SET SESSION transaction_isolation = 'REPEATABLE-READ';
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SESSION VARIABLES LIKE 'transaction_isolation';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
MySQL 兼容性
- TiDB 仅支持语法上设置事务为只读的能力。
- 不支持
READ-UNCOMMITTED
和SERIALIZABLE
这两个隔离级别。 REPEATABLE-READ
隔离级别通过使用快照隔离技术实现,部分兼容 MySQL。- 在悲观事务中,TiDB 支持两个与 MySQL 兼容的隔离级别:
REPEATABLE-READ
和READ-COMMITTED
。详细描述请参见 Isolation Levels。