2017-03-17 91 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)。

接下來,您可以在票據表中設置標誌,例如「正在等待」,「已應答」等。

你如何從票據表中獲取信息,就是簡單地計算具有特定標誌的行。

或者你可以使用鎖,但在繁忙的系統上這會導致延遲。

我不完全確定你要完成什麼,因爲你沒有真正告訴我們,所以我的答案是基於假設。例如:您需要一個票號系統,並能夠計算等待票數。

相關問題