2017-03-17 73 views
0

我有从多个浏览器实例通过ajax调用的函数。阻止另一个数据库查询执行,直到一组查询结束

public function update_counters($message) 
    { 

     //increment ticket counter 
     $this->db->where('id', 1); 
     $this->db->set('ticket', 'ticket+1', FALSE); 
     $this->db->update('counter'); 

     //increment waiting counter 
     $this->db->where('id', $message); 
     $this->db->set('waiting', 'waiting+1', FALSE); 
     $this->db->update('ambulance'); 

     //get value from ticket counter 
     $query = $this->db->get_where('counter', array('id' => 1)); 

    $row = $query->row();  

     //add new row in ticket table 
     $data = array(
      'ticket' => ($row->ticket), 
      'ambulance' => $message 
      );    

    $this->db->insert('ticket', $data); 

    //  
    return $row->ticket; 

    } 

这些查询是一个接一个执行的,并且在函数调用较少时工作正常。但是,当更多的用户同时调用该函数或一个用户多次且非常快速地调用该函数时,问题就会发生。问题是第一个(票证柜台)在插入之前会增加两次。这会导致2个插入的行具有相同的票证值。我怎样才能确保下一个应该完成的增量只发生在前一次插入?

+0

阅读关于'TABLE LOCK' https://dev.mysql.com/doc/refman/5.7/en/lock-tables.html google_codeigniter和lock tables_ – JustOnUnderMillions

回答

2

对不起,但您的整个方法似乎有缺陷。

随数据库更改而变化的信息应仅存储在数据库中。

你有一张门票表。每张票都应该有一个唯一编号,可能是票据表的自动增加主索引(https://www.sqlite.org/autoinc.html)。

接下来,您可以在票据表中设置标志,例如“正在等待”,“已应答”等。

你如何从票据表中获取信息,就是简单地计算具有特定标志的行。

或者你可以使用锁,但在繁忙的系统上这会导致延迟。

我不完全确定你要完成什么,因为你没有真正告诉我们,所以我的答案是基于假设。例如:您需要一个票号系统,并能够计算等待票数。

相关问题