为什么MyISAM解决了InnoDB引起的这个问题?

时间:2011-05-29 10:56:15

标签: mysql innodb myisam

我在MySQL应用程序的Python中遇到了一个非常奇怪的错误。以下代码位于多次调用的循环中。代码从未引发错误,但也从未插入任何数据:

    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修复它。为什么呢?

1 个答案:

答案 0 :(得分:6)

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

另见PEP 249 on database access in Python