乐观和悲观的锁定

时间:2010-05-20 17:34:17

标签: php codeigniter

在我的第一个php / Codeigniter项目上工作,我已经在'网上搜索了关于锁定访问编辑数据的信息,并且没有找到太多信息。

我希望2个用户尝试同时编辑同一个表单时会经常发生这种情况。

我的经验(在BBx,filePro和其他RAD应用程序的有状态世界中)是使用悲观锁定锁定正在编辑的数据 - 当时用户可以访问编辑表单。第二个用户基本上必须等待第一个完成。我知道这可以使用Ajax发送XMLHttpRequests来维护“锁定”数据库。

缺乏状态的php世界似乎更喜欢乐观锁定。如果我理解正确,它的工作原理如下:两个用户都可以访问数据,并且每个用户都记录一个“更改前”版本的数据。在保存更改之前,将再次检索数据并比较“更改前”版本。如果两个版本相同,则写入用户更改。如果他们不同;向用户显示自他/她开始编辑后发生了哪些更改,并添加了一些机制来解决差异 - 或者用户显示“抱歉,再试一次”消息。

我对这里的人们在实施悲观和乐观锁定方面的经验感兴趣。如果有任何库,工具或“如何使用”我很感激链接。

由于

2 个答案:

答案 0 :(得分:2)

据我所知,CodeIgniter不支持锁定行。 如果要实现乐观锁定,则应添加必须在每次更新/插入时更改的版本列或时间戳列。将版本列放入表单中的隐藏字段。然后在每次更新之前添加一个where子句,如:

$this->db->where('version',$editedVersion);

$this->db->where('timestamp',$editedTimestamp);

然后你应该检查更新是否正确更新了1行..

$this->db->where('id',$editedId);
$this->db->update('tablename',$data);
$rowsAffected = $this->db->affected_rows();
if ($rowsAffected == 0) {
    /* Data changed by other user, update failed */
} else {
   /* updated successfully */
}

答案 1 :(得分:0)

如果使用InnoDB存储引擎,则可以通过SELECT FOR UPDATE语句获取行级别的独占锁。

SELECT ... FOR UPDATE and SELECT ... LOCK IN SHARE MODE Locking Reads

InnoDB Lock Modes