Skip to content

事务中的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|