START TRANSACTION
START TRANSACTION 语句用于在 TiDB 内部启动新事务。它类似于语句 BEGIN。
在没有 START TRANSACTION 语句的情况下,每个语句都会在各自的事务中自动提交,这样可确保 MySQL 兼容性。
语法图
BeginTransactionStmt:
1. BeginTransactionStmt ::=
2. 'BEGIN' ( 'PESSIMISTIC' | 'OPTIMISTIC' )?
3. | 'START' 'TRANSACTION' ( 'READ' ( 'WRITE' | 'ONLY' ( ( 'WITH' 'TIMESTAMP' 'BOUND' TimestampBound )? | AsOfClause ) ) | 'WITH' 'CONSISTENT' 'SNAPSHOT' | 'WITH' 'CAUSAL' 'CONSISTENCY' 'ONLY' )?
5. AsOfClause ::=
6. ( 'AS' 'OF' 'TIMESTAMP' Expression)
示例
1. CREATE TABLE t1 (a int NOT NULL PRIMARY KEY);
1. Query OK, 0 rows affected (0.12 sec)
1. START TRANSACTION;
1. Query OK, 0 rows affected (0.00 sec)
1. INSERT INTO t1 VALUES (1);
1. Query OK, 1 row affected (0.00 sec)
1. COMMIT;
1. Query OK, 0 rows affected (0.01 sec)
MySQL 兼容性
- 执行
START TRANSACTION在 TiDB 中开启事务并立即生成快照。而在 MySQL 中,执行START TRANSACTION会开启事务但不会立即生成快照。TiDB 中的START TRANSACTION等同于 MySQL 中的START TRANSACTION WITH CONSISTENT SNAPSHOT。 - 为与 MySQL 兼容,TiDB 会解析
START TRANSACTION READ ONLY语句,但解析后 TiDB 仍允许写入操作。
