我有一个包含一些UNIQUE
行的数据库。使用重复项mysql_query()
进行插入时,会按预期返回非零(错误),但稍微调用mysql_errno()
的次要操作不会返回MYSQL_DUPLICATE_KEY_ERROR_CODE
,而是0
。mysql_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()返回后,可以释放锁,其他线程可以查询同一个连接。