COMMIT
COMMIT
语句用于在 TiDB 服务器内部提交事务。
在不使用 BEGIN
或 START TRANSACTION
语句的情况下,TiDB 中每一个查询语句本身也会默认作为事务处理,自动提交,确保了与 MySQL 的兼容。
语法图
- CommitStmt
- CompletionTypeWithinTransaction
CommitStmt ::=
'COMMIT' CompletionTypeWithinTransaction?
CompletionTypeWithinTransaction ::=
'AND' ( 'CHAIN' ( 'NO' 'RELEASE' )? | 'NO' 'CHAIN' ( 'NO'? 'RELEASE' )? )
| 'NO'? 'RELEASE'
示例
CREATE TABLE t1 (a int NOT NULL PRIMARY KEY);
Query OK, 0 rows affected (0.12 sec)
START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
INSERT INTO t1 VALUES (1);
Query OK, 1 row affected (0.00 sec)
COMMIT;
Query OK, 0 rows affected (0.01 sec)
MySQL 兼容性
- 目前,TiDB 不使用元数据锁 (MDL) 来防止 DDL 语句修改事务使用的表。如果表定义被更改,提交事务将导致报错
Information schema is changed
。此时,事务会自动回滚。 - TiDB 3.0.8 及更新版本默认使用悲观事务模式。在乐观事务模型下,需要考虑到修改的行已被另一个事务修改,导致
COMMIT
语句可能执行失败的情况。 - 启用乐观事务模型后,
UNIQUE
和PRIMARY KEY
约束检查将延迟直至语句提交。当COMMIT
语句失败时,这可能导致其他问题。可通过设置tidb_constraint_check_in_place=TRUE
来改变该行为。 - TiDB 解析但忽略
ROLLBACK AND [NO] RELEASE
语法。在 MySQL 中,使用该语法可在提交事务后立即断开客户端会话。在 TiDB 中,建议使用客户端程序的mysql_close()
来实现该功能。 - TiDB 解析但忽略
ROLLBACK AND [NO] CHAIN
语法。在 MySQL 中,使用该语法可在提交当前事务时立即以相同的隔离级别开启新事务。在 TiDB 中,推荐直接开启新事务。