使用非事务性引擎的DDL语句和操作不会在thd->事务列表中“注册”,因此不会修改事务状态。此外,MySQL中的每个DDL语句都以隐式的普通事务提交(对end_active_trans()的调用)开始,因此没有留下任何可修改的内容。然而,如上所述的CREATE TABLE ..SELECT,一些DDL语句可以启动一个*new*事务。
在这种情况下,服务器的行为目前定义得很糟糕。DDL语句使用一种“语义”日志记录形式来维护原子性:SELECT失败,表t被删除。此外,一些DDL语句会发出临时事务提交:例如,当数据从原始表复制到内部临时表时,ALTER TABLE会发出提交。其他语句,例如,CREATE TABLE…选择,不要总是自己提交。最后还有一组DDL语句,比如RENAME/DROP TABLE,它们不会启动新的事务,也不会提交。
这种多样性使得很难说明如果在DDL语句期间偶然调用存储的函数会发生什么——不清楚它所做的任何修改是否会被提交。幸运的是,SQL语法只允许少数DDL语句调用存储的函数。也许,为了一致性,MySQL应该总是在DDL语句之后提交一个普通事务,就像它在语句末尾提交一个语句事务一样。