Django与MySQL的非事务性更改无法回滚
我在使用MySQL数据库时总是收到这个警告:
一些非事务性更改的表无法回滚
我不太明白这是什么意思,也不知道它是否真的会造成问题,但我希望有人能告诉我这到底是怎么回事。
我正在处理一个CSV文件,逐行读取,并使用get_or_create
创建Django对象。在收到这个消息后,当我尝试重现这个问题时,我会在CSV文件中继续往下读取,直到出现警告。
我试着在网上查找这个错误的相关信息,但我真的不明白它的意思。理想情况下,我想弄清楚是什么导致了这个问题,但如果我无法找到原因,我在想是否可以忽略这个警告,因为它可能并没有对我的数据库产生负面影响。
2 个回答
对我来说,这个错误发生在我从另一个Django应用导入一个表的时候。原来的数据库里所有的表都是用MyISAM这种引擎,而目标应用里的所有表都是用InnoDB引擎。当我导入这个已有的表时,它的引擎就从InnoDB变成了MyISAM,以便和原来的数据库保持一致。我是通过命令行的MySQL来解决这个问题的,具体操作如下:
$ mysql -uroot -pPASSWORD
> use MY_DB;
> show table status;
> alter table TABLE_WITH_MYISAM engine=innodb;
> quit;
我导入了5个表,所以我需要对每个表都执行一次修改命令。上面的显示命令会列出MY_DB中所有表的名称和引擎设置。
希望这能帮你解决问题!祝好运!
当你把事务表
和非事务表
混在一起使用时,就会出现这种情况。对非事务表的修改不会受到ROLLBACK
语句的影响。
可能导致这种情况的原因有很多,我们可以参考一下文档:
如果你不是故意在事务中混用事务表和非事务表,那么这个提示最可能的原因是你认为是事务表的某个表其实并不是。如果你尝试使用一个你的mysqld服务器不支持的事务存储引擎来创建表(或者这个引擎在启动时被禁用了),就会发生这种情况。如果mysqld不支持某个存储引擎,它就会把这个表创建成MyISAM表,而MyISAM是非事务表。
这会带来负面影响,比如你有一个HTTP
请求启动了一个事务,你做了一些修改,然后需要回滚。事务表会回滚,但其他表不会。如果你的软件需要使用事务存储引擎,你应该考虑把所有相关的表迁移到InnoDB
引擎。