mysql不能回滚问题

来源:互联网 发布:mac上的p图软件 编辑:程序博客网 时间:2024/05/06 09:19

今天遇到一个自己认为很诡异的问题:mysql无法回滚


详细描述:

之前的项目中有块功能是需要的动态创建表,因为之前测试很简单没发现这个问题,导致今天问题暴露了。

创建表语句是这样的:

CREATE TABLE `test` (`auto_id` int NOT NULL auto_increment COMMENT "自增字段",`enum` smallint NOT NULL COMMENT "枚举单选测试",`multi` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT "枚举多选测试",`key1` int(7) NOT NULL COMMENT "键1",`key2` smallint NOT NULL COMMENT "键2",`text1` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT "文本1",PRIMARY KEY (`auto_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

排查问题,故意在代码中抛出异常来触发回滚命令。

执行完代码发现回滚命令已经执行,但是表依然创建了,反复多次,都是一样。

开始排查:

1.检查Python代码是否启动事务处理...已启用

2.检查MySQL-python驱动是否有问题...经测试没有问题

3.mysql数据库、表存储引擎是否是Innodb...是


这2项检查完就开始头疼了,因为涉及到事务无法回滚一般都是这2块没有设置好导致。

但是现在2块检查完毕都是没有问题的,怎么会无法回滚。


没办法,只能找mysql官方手册看看能否找到原因。

找了一段时间,终于在mysql手册的 "MySQL事务处理和锁定语句"段中找到答案

13.4.2. 不能回滚的语句有些语句不能被回滚。通常,这些语句包括数据定义语言(DDL)语句,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。您在设计事务时,不应包含这类语句。如果您在事务的前部中发布了一个不能被回滚的语句,则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。

原来对于数据定义语句是无法回滚的。


思过:

怪自己太浮躁,mysql手册很多东西都没有详细阅读过。