2010-05-20 146 views
4

在我的第一个PHP/Codeigniter项目上工作,我已经搜索了关于锁定访问编辑数据的信息,但没有找到非常多的信息。乐观和悲观的锁

我希望它是一个相当经常发生的2个用户试图同时编辑同一个表单。

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

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

我对人们在实施悲观和乐观锁定方面的经验感兴趣。如果有任何图书馆,工具或'how-to's available我很欣赏链接。

感谢

+1

.NET数据集也使用乐观并发。 – Powerlord 2010-05-20 17:58:09

回答

2

据我所知,笨有没有支撑锁定行。 如果要实现乐观锁定,则应添加每个更新/插入必须更改的版本列或时间戳列。将版本列放入表单中的隐藏字段中。然后,每个更新之前,添加一个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 */ 
}