我正在尝试使用像这样的codeigniter查询函数来更新列的值:
$this->db->query("UPDATE table SET val = val + 1 WHERE name = 'xxxxx');
有没有办法在同一个查询函数中获得此更新的结果?为了做到这一点,我必须做一个选择查询,这很危险,因为此应用程序正在管理用户。
如果更新和选择之间存在另一个查询,则结果将不正确。
谢谢!
最佳答案
使用事务进行更新。这是来自zend的示例,它是一种类似的数据库访问方式:
$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
以及有关代码初始化器事务的信息:http://ellislab.com/codeigniter/user-guide/database/transactions.html(感谢@Nanne)