我正在尝试使用像这样的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)

09-10 03:18
查看更多