写了一个存储过程
create  procedure sp_test()
begin 
     select tmp_id,tmp_name from tmp_table  where tmp_atatus=0 order by tmp_id desc limit 2; 
     update  tmp_table  set  tmp_atatus=1      where tmp_atatus=0 order by tmp_id desc limit 2; 
end$$程序里面每一秒调用一次这个存储过程,然后就发现,偶尔会出现select和update操作的不是同两个数据。
也是就是select取到的是1,2数据,update操作的是3,4数据。
对mysql不熟悉,求大神指教一下..

解决方案 »

  1.   

     select tmp_id,tmp_name from tmp_table  where tmp_atatus=0 order by tmp_id desc limit 2 for update; 
      

  2.   

    先在tmp_atatus上加了索引再试试
      

  3.   

    原因是where tmp_atatus=0 order by tmp_id desc limit 2选定的行没有加锁,加上for update试试。在select那一行。
      

  4.   

    我加上了,但是概率减小了,并没有完全消除。
    程序里面还有一句sql对tmp_table操作,但是,是顺序执行的代码,跟调用这个存储过程的一前一后,并且存储过程是每隔一秒才调用一次。
    while(1)
    {
      ...
      if(interval(1000))
         sql(sp_test);
      ...
      changesql("update tmp_table set tmp_atatus=2 where tmp_id=? ");
      ...
    }再弱弱的问一下:存储过程里面难道不是按顺序执行的么,还要加个锁。
      

  5.   

    既然这样,你不如把select出来的主键值放到变量里,然后随后的update语句加上这些变量值作为判断条件。  select <pk>, tmp_id,tmp_name from tmp_table  where tmp_atatus=0 order by tmp_id desc limit 2; 
         update  tmp_table  set  tmp_atatus=1      where <pk>=:<pk> and ....; 
      

  6.   

    是在你UPDATE的之前,有其它进程对表tmp_table  进行了操作。
      

  7.   

    没有多线程,只有这么一个循环。
    貌似是执行的太快了,那个存储过程还没执行完,程序里面的就已经执行到下面的changesql语句了,我加了一个sleep好了。
    但是我想问一下,这个是神马情况,C++程序只管调用一下,不管那个存储过程是否执行完了么?