事务中的DDL
事务包括开始和结束。
事务开始:一个事务在遇到第一个可执行的SQL语句时开始。
- DML语句
- DDL语句
- SET TRANSACTION语句
事务结束:一个事务在遇到以下情况时结束。
- COMMIT
- ROLLBACK(不指定SAVEPOINT)
- DDL语句
- 用户退出(正常或异常)
注意:
如果事务中有DDL语句,需要格外注意,因为会隐性破坏该事务。
示例
在DELETE表1中的数据后,进行DROP表2的操作,然后需要ROLLBACK对表1的DELETE操作,但实际执行结果是并未回退DELETE操作。因为在DROP操作之前的事务已被隐性结束并提交,而后续的ROLLBACK操作,回退的是DROP后的DML语句。
sql
CREATE TABLE tab_trans_1(id INT, c2 VARCHAR);
CREATE TABLE tab_trans_2(id INT);
INSERT INTO tab_trans_1 VALUES(1, 'a');
INSERT INTO tab_trans_1 VALUES(2, 'b');
INSERT INTO tab_trans_1 VALUES(3, 'c');
-- 包含 DDL 语句的事务
BEGIN
DELETE FROM tab_trans_1 WHERE id > 1;
DROP TABLE tab_trans_2;
ROLLBACK;
END;
/
-- 查询结果
SELECT * FROM tab_trans_1;
ID | C2 |
------------------------------------------------------------------------------
1 | a|