为什么MyISAM可以解决由InnoDB造成的这个问题?

问题描述:

我在MySQL应用程序的Python中遇到了一个非常奇怪的错误。以下代码位于多次调用的循环中。该代码从未提出一个错误,但也从未插入任何数据:为什么MyISAM可以解决由InnoDB造成的这个问题?

cursor = db.cursor() 
    cursor.execute(""" 
     INSERT INTO test_1 (value) VALUES (10000); 
    """) 

另一个奇怪症状是,将数据插入使用phpMyAdmin同一个表以后产生了非常大的auto_increment ID,因此该AUTO_INCREMENT计数器正在甚至递增尽管表中没有数据(根据SELECT * FROM test_1)。插入工作正常使用MySQL Workbench。

最后我随机发现,在表上使用MyISAM引擎而不是InnoDB来修复它。为什么?

+5

有人猜测,你泄漏的交易最终回滚了,而MyISAM不支持交易... – 2011-05-29 10:58:56

很可能是因为您从未称过commit。 MySQLdb(我想这就是你正在使用的模块)automatically starts a transaction对于你对数据库服务器的每一个连接。所有插入查询都可以正常工作,并且可以增加auto_increment计数器,但是您从不会看到phpMyAdmin的结果,因为InnoDB会将其连接与通过python所做的更改隔离开来。如果您的Python脚本断开连接并且没有进行调用,则事务将回滚并且不会更改(除了递增的auto_increment计数器外)。看看db.commit()(假设db是连接对象)是否有帮助。

另请参阅PEP 249 on database access in Python

+0

发布问题时我没有想到的另一个因素:这实际上是我第一次一个INSERT语句在应用程序的任何地方。这应该是一个线索。 – Trindaz 2011-05-30 04:16:25