录制程序有一功能:将录制的文件信息写入MySQL数据库,供BS系统查询。

因此封装了一个MySQL类,进行数据库操作。

主要接口为Update():执行SQL语句。

现在问题来了:

(一)在某个场景下,我们在向table1中insert一条记录后,需要得到得到它的ID,然后update与之匹配的另一张表table2中的记录。由于insert本身并不返回结果集,因此我们无法直接得到插入记录的ID。

那该怎么办呢?

之前从BS组得到的方法是:在table1中执行insert后,立即执行另一条语句:“select @@IDENTITY;”;该语句会返回最后插入的那条记录的ID,这样问题就解决了。

但是,在一次codeview上,头儿提出了一个问题:如果在多线程中,在向table1执行insert后,另一个线程也执行了sql语句对数据库进行操作,这时再执行“select @@IDENTITY;”,能得到正确的结果吗?

很显然,确实存在这种问题:即我们无法保证整个过程的原子性,但这可以通过加锁来解决。

头儿又问:那这时候如果其他的客户端连接到数据库,执行了查询,会更改“select @@IDENTITY;”的结果吗?

当时没考虑到这一点,后来通过查询mysql手册(http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html),发现系统变量IDENTITY的作用范围是“SESSION”,也就是其他客户端、其他连接执行的query不会更改本次连接的IDENTITY变量的值,因此不会有影响。

后来发现mysql提供了内部函数LAST_INSERT_ID(),我认为比“select @@IDENTITY;”更合理。

(二)另一个问题,针对有些查询,我们需要获取并处理结果集。

原来是在Mysql类中封装了一个成员变量MYSQL_RES* m_res,用来保存有返回的查询结果集。这样一来,我们执行Update()的后,如果需要获取结果集就调用GetQueryResult()来获取结果集,用完之后再释放掉。

但是问题在于:在多线程环境中,我们可能有多个Update()需要获取结果集,但是如果它们共用一个成员变量m_res来存储结果集的话,我们必须等待一次查询使用完它的结果集并释放后才能执行下一次的Update(),否则MySQL就会报错:“”,因为此时m_res还未被释放,不能执行下一次查询。

针对以上问题,我们的解决办法是:对查询接口做调整。

一共提供两个查询接口:

(1)Update():执行查询;针对问题(一),开启multi-query支持,允许一次执行多条sql语句,具体操作参看(http://dev.mysql.com/doc/refman/5.1/en/c-api-multiple-queries.html);这样我们在Upadte时使用类似

insert into t_alarm_record_file (recordPath,recordName,hostIp,startTime,endTime,deviceId,programNumber,deviceType,interfaceNo,alarmType,alarmTime) values ('/figure/data/AlarmRecord/StreamTS/1-码流_魅力音 乐主路/2011-11-07/20111107150116.ts','','10.0.60.2','2011-11-07 15:01:16','1970-01-01 08:00:00',37486602,3905,'0',1,12,'2011-11-07 15:01:20');update t_alarm set fileId = LAST_INSERT_ID() where deviceId = 37486602 and programNumber = 3905 and alarmType = 12 and alarmDate = '2011-11-07 15:01:20' and fileId is null

的语句一次执行两条sql语句就可完美的解决这种问题了;

(2)Update2():执行查询,并返回结果集给调用者,由调用者自己处理并决定何时释放该结果集,由于该结果集是以参数的形式返回的,因此多线程不会受到影响。

但在实际测试中,还是出现问题:"Commands out of sync; you can't run this command now",我们的日志显示:

2011-11-07 15:01:28,660: INFO : Update OK!sql: insert into t_alarm_record_file (recordPath,recordName,hostIp,startTime,endTime,deviceId,programNumber,deviceType,interfaceNo,alarmType,alarmTime) values ('/figure/data/AlarmRecord/StreamTS/1-码流_魅力音 乐主路/2011-11-07/20111107150116.ts','','10.0.60.2','2011-11-07 15:01:16','1970-01-01 08:00:00',37486602,3905,'0',1,12,'2011-11-07 15:01:20');update t_alarm set fileId = LAST_INSERT_ID() where deviceId = 37486602 and programNumber = 3905 and alarmType = 12 and alarmDate = '2011-11-07 15:01:20' and fileId is null

2011-11-07 15:01:35,331: ERROR : Update failed!sql: insert into t_alarm_record_file (recordPath,recordName,hostIp,startTime,endTime,deviceId,programNumber,deviceType,interfaceNo,alarmType,alarmTime) values ('/figure/data/AlarmRecord/StreamTS/1-码流_魅力音 乐主路/2011-11-07/20111107150116.ts','','10.0.60.2','2011-11-07 15:01:16','1970-01-01 08:00:00',37486602,3905,'0',1,13,'2011-11-07 15:01:27');update t_alarm set fileId = LAST_INSERT_ID() where deviceId = 37486602 and programNumber = 3905 and alarmType = 13 and alarmDate = '2011-11-07 15:01:27' and fileId is null, ERROR:Commands out of sync; you can't run this command now

在第一次调用Update()执行多条sql语句时成功,但以后的所有调用都失败了。

经过查找,发现问题在于:在Update()中执行多条sql语句时,

如果仅仅是插入等不需要返回值的SQL语句,也一样得读完整个resault集并释放,最小化的写法:

do

{

result = mysql_store_result( mysql );

mysql_free_result(result);

}while( !mysql_next_result( mysql ) );

经过这么一处理,问题终于解决了。

commands out of sync mysql_MySQL问题一则:Commands out of sync; you can't run this command now以及相关问题...相关推荐

  1. mysql error:2014 Commands out of sync; you can't run this command now

    最近在项目中经常会出现数据库操作失败的,日志抛出的错误的 Commands out of sync; you can't run this command now.但是把具体的这条sql语句放到可视化 ...

  2. Mysql++关于多数据集查询Commands out of sync; you can‘t run this command now的问题

    今天在项目中使用了Mysql++调用Mysql的存储过程来实现功能,但是碰到一个有意思的问题,当成功调用存储过程后,再次做其他的查询,确返回Commands out of sync; you can' ...

  3. htc sync for all htc android phones,HTC Sync 手机电脑同步软件

    HTC Sync 安装指示 应用程序- HTC Sync for all HTC Android Phones & HTC Smart 您可以使用HTC Sync 同步计算机和手机上的Outl ...

  4. android系统构建系统_构建系统简介

    android系统构建系统 Jan. 21. 2016 2016年1月21日 Roughly speadking, build in software development is the proce ...

  5. 树莓派 安装 Syncthing 自建私有云盘 照片备份 备份手机相册

    手机上存着不少照片,自己又时常折腾手机,总有数据丢失的问题,又对市面上的云盘不怎么放心,所以打算在家里利用树莓派搭建一个私有云.一番查找之后,发现了 syncthing.Syncthing 是一个跨平 ...

  6. mysql执行存储过程提示out of_PHP执行MYSQL存储过程报错:Commands out of sync; you can't run...

    php中在同时执行2个存储过程时,有一个程序2个储存过程都执行,有一个程序只执行第一个调用.2个都执行的调用如下: $mydb->query("delete from pinfo wh ...

  7. commands out of sync mysql,MySQL-python: Commands out of sync

    在给 MySQL 数据库访问层增加新功能时遇到了这样的错误: ProgrammingError: (2014, "Commands out of sync; you can't run th ...

  8. commands out of sync错误

    第一种情况: commands out of sync.  Did you run multiple statements at once 可能的原因:是在事务之中写了查询语句. 解决方案:把查询语句 ...

  9. Run Commands Remotely via SSH with No Password

    转自http://www.dotkam.com/2009/03/10/run-commands-remotely-via-ssh-with-no-password/ Extremely useful ...

最新文章

  1. php设置文件权限问题,关于.user.ini以及php访问上级文件权限问题
  2. java常见不可变类_Java语言不可变类的诀窍
  3. WatchOS系统开发大全(6)-WKInterfaceLabel
  4. 计算机系统的可靠性可以用什么来表示,系统分析师考试计算机系统的可靠性指标...
  5. 样条之贝塞尔(Bezier)
  6. zabbix server 迁移步骤
  7. qt程序部署在linux,Qt应用打包发布,部署真正的Qt程序LinuxWindows-Go语言中文社区...
  8. 浏览器调试时控制台出现:Uncaught SyntaxError: Unexpected identifier
  9. 神经网络之智能科学与技术专业
  10. 了解下Bit,Byte,KB,MB,GB的换算关系
  11. SpringBoot+zxing批量生成二维码_南国
  12. VC/MFC 编程经验
  13. scp 是我小看了你---基于密钥传输!
  14. 基于组态王和三菱PLC的modbus仿真(七)——RS指令
  15. win10 cmd 中文乱码
  16. 用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密...
  17. Unity+Vuforia+Hololens2 AR开发
  18. C++/QT生成二维码和扫瞄二维码
  19. winscp连接nas root账户拒绝访问_树莓派 3B 结合 NextCloud PI 搭建皮米级 NAS 家庭储存...
  20. 六度分离 (无向图最短路径问题)

热门文章

  1. 05-20210301在WIN10下通过串口给华为海思Hi3516DV300刷机(鸿蒙系统)
  2. mysql sql判断语句,SQL条件判断语句语法
  3. python3 format函数 详解
  4. mysql触发器的作用
  5. java生成xml符号被转义_xml 转义特殊字符
  6. 说说 JavaScript 对浏览器的怪癖检测
  7. Python Prim 算法 生成迷宫
  8. SonarQube代码质量管理平台安装与使用
  9. 关于清洁设备锂电池的正确使用方法,你了解吗
  10. 最好用的Redis Desktop Manager 0.9.3 版本下载 以及源码编译教程