Mysql 为什么MyISAM可以解决InnoDB引起的这个问题?

Mysql 为什么MyISAM可以解决InnoDB引起的这个问题?,mysql,innodb,myisam,Mysql,Innodb,Myisam,我在MySQL上的Python应用程序中遇到了一个非常奇怪的错误。以下代码位于一个被多次调用的循环中。代码从未引发错误,但也从未插入任何数据: cursor = db.cursor() cursor.execute(""" INSERT INTO test_1 (value) VALUES (10000); """) 另一个奇怪的症状是,稍后使用phpMyAdmin将数据插入到同一个表中会产生非常大的自动增量ID,因此即使表中实际上没有数据,自动增量计数

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

    cursor = db.cursor()
    cursor.execute("""
        INSERT INTO test_1 (value) VALUES (10000);
    """)
另一个奇怪的症状是,稍后使用phpMyAdmin将数据插入到同一个表中会产生非常大的自动增量ID,因此即使表中实际上没有数据,自动增量计数器也会递增(无论如何,根据测试1中的SELECT*)。使用MySQL工作台,插入工作正常


最后,我随机发现在表上使用MyISAM引擎而不是InnoDB解决了这个问题。为什么?

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


另请参见。

据猜测,您泄漏了事务,这些事务最终被回滚,而MyISAM不支持事务……发布问题时我没有想到的另一个因素是:这实际上是我第一次在应用程序中的任何位置使用INSERT语句。这应该是一个线索。