我有从多个浏览器实例通过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 :(得分:2)
很抱歉,但你的整个方法似乎有缺陷。
随数据库中的更改而变化的信息应仅存储在数据库中。
你有一张门票表。每个票证都应该有一个唯一的编号,可能是票证表的自动增加主索引(https://www.sqlite.org/autoinc.html)。
接下来,您可以在故障单表格中显示标记,例如“等待”,“已回答”等。
您从票证表中获取信息的方法是简单地计算带有某些标志的行。
或者你可以使用锁,但在繁忙的系统上,这会导致延迟。
我不完全确定你要完成什么,因为你没有真正告诉我们,所以我的回答是基于假设。类似的东西:你需要一个票号系统,并能够计算等候票。