日期:2014-05-16  浏览次数:20820 次

mysql C API在windows下是线程安全的么?
问题场景:

一个程序内有2个以上守护线程,当某条件触发时,调用mysql_query向mysql数据库内插入一个记录,经过试验,发现两个线程同时触发条件向mysql内插入记录时,报错如下:



怀疑是因为两个线程同时向数据库内插入记录造成的冲突。

问题:

1. Windows环境下,mysql_query是线程安全的么? 我使用mysql server 5.5.16,程序启动是就初始化一个数据库连接,调用mysql_real_connect,以后保持长连接不断开,需要插入记录时调用mysql_query

2. 如果不是线程安全的,有什么可靠的解决方案?

3. 搜索了一下那个错误信息,有几个建议是关于mysql服务器配置的,如修改bind-ipaddress,修改skip-name-resolve等,我是在window下安装的mysql,配置文件里貌似就没有这些选项。。。

求指点

------解决方案--------------------
当你两个线程同时做插入操作时,会因争抢 MYSQL mysql 而出错,所以你可以在各自的线程中定义单独的mysql变量,在连接数据库。之后执行同时插入等操作就不会有问题了。
------解决方案--------------------
显然不是线程安全的。
可以为每个线程创建单独的mysql连接,如楼上所说,创建独立的mysql* 句柄。
这样不至于互相干扰。