我正在尝试使用codeigniter查询函数更新列的值,如下所示:
$this->db->query("UPDATE table SET val = val + 1 WHERE name = 'xxxxx');
有没有办法在同一查询函数中获取此更新的结果?我必须执行选择查询才能执行此操作,并且由于此应用程序正在管理的用户数量,这很危险。
如果更新和选择之间存在另一个查询,则结果将不正确。
谢谢!
答案 0 :(得分:1)
使用交易和更新。这是zend的一个例子,它是一种类似于db访问的东西:
$db->beginTransaction();
$val = $db->select()->forUpdate()->from('table', 'val')->orderBy('val DESC')->limit(1)->query()->fetchColumn();
$db->update('table', 'val = '.($val+1), 'name = "xxx"');
$db->commit()
事务的for-update会阻止另一个查询干扰。
在此处了解有关更新的详情:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
关于这里的codeigniter交易:http://ellislab.com/codeigniter/user-guide/database/transactions.html(感谢@Nanne)