同时执行MySQL插入会导致不稳定的行为

时间:2014-09-12 13:46:23

标签: mysql multithreading

我有一个包含一些UNIQUE行的数据库。使用重复项mysql_query()进行插入时,会按预期返回非零(错误),但稍微调用mysql_errno()的次要操作不会返回MYSQL_DUPLICATE_KEY_ERROR_CODE,而是0mysql_errorno()。测试显示,这可重复连接到在该DB中执行插入的多个线程。只运行一个将记录添加到数据库的线程工作正常,INSERT INTO dbname.tablename (columnname1, columnname2...) VALUES (val1, val2...)返回预期的错误代码。 InnoDB和MyISAM都会发生这种情况。我正在使用C接口。

后来补充:在阅读NB的评论后,我觉得“在该DB中插入多个线程”太模糊了。唯一的插入是“冒犯”的插入,它们可以在一个线程或多个线程中运行。我的意思是它是{{1}}形式的顺序查询,或者它们是并行完成的。我不知道如何在不添加大量(可能不相关的)代码的情况下进一步详细说明。

=============================================== =============

发现问题,这是因为在所有线程中使用相同的MYSQL *句柄。它记录了行为:http://dev.mysql.com/doc/refman/5.1/en/c-api-threaded-clients.html

多个线程无法在同一连接上同时向MySQL服务器发送查询。特别是,您必须确保在一个线程中调用mysql_query()和mysql_store_result()之间,没有其他线程使用相同的连接。你必须在你的mysql_query()和mysql_store_result()调用对之间有一个互斥锁。 mysql_store_result()返回后,可以释放锁,其他线程可以查询同一个连接。

0 个答案:

没有答案