另一个用户正在编辑记录时阻止编辑记录 - 如何?

问题描述:

我正在尝试将记录锁定添加到网站。这不是数据库锁定,我有2个进程同时编辑同一记录,而是2个用户同时编辑同一记录。这是的情况:另一个用户正在编辑记录时阻止编辑记录 - 如何?

我需要能够锁定一个记录,而一个人正在编辑它,以便其他人可以同时进行更改记录(并因此造成混淆)。用户A开始编辑记录会发生什么情况。同时(在用户A保存记录之前),用户B开始编辑记录。现在,用户A将具有值“0001”的field_a的记录保存起来。现在用户B正在查看和编辑记录的过期版本。然后用户B将该记录保存为“0002”值。数据库最终的值为0002.

我可以理解发生了什么,但用户很难确定数据库中的值将是0002而不是0001.在我的情况下,他们正在使用此号码以将在线数据库中的记录与另一个记录相关联。发生这种情况时,他们将在其他系统中记录2条记录,以在线系统记录1条记录。

我的想法是通过在用户的ID字段中“锁定”一条记录。当它没有被锁定时。 > 0被锁定。

这里是我的事情将如何运作这样的想法:

  • 当用户点击一个记录的编辑,他们将获得备案的锁。
  • 他们将有这个锁最多X分钟(可能30)。这是因为点击后退按钮而不是保存或取消。
  • 保存后,记录将被解锁。
  • 要在不保存的情况下移除锁定,他们需要点击编辑页面上的“解锁”(或类似)。我会取消,但我希望他们能够取消并仍然保持锁定状态。
  • 在记录列表中,我将包含锁定记录的人员的姓名,以便每个人都知道。
  • 管理员将能够删除记录的锁,只是将它全部拆开。
  • 在每个页面上添加一个区域,以警告用户当前记录需要在完成时解锁或者仅在每个页面上显示他们锁定的记录数。
  • 添加一个脚本,用于检查已锁定超过30分钟的记录并解锁它们(可能向锁定该记​​录的用户发送电子邮件)。

我想知道的是,如果有任何情况下,我想念会导致悲伤或如果你有任何建议如何做到这一点?

注意:我正在使用PHP和MySQL,它是一个Web应用程序。我也不认为数据库中的记录锁定是我需要的。

- 此外:从Dan Hulton的建议是添加一个日期字段,将存储最后一次检出它的时间。这将消除用于检查过期结账的脚本。相反,系统只会在列出或限制编辑记录时检查此日期。

那么,你需要一些锁定方案。对于那种你在谈论的事情,人们常常用“乐观锁”,它是这样工作的:

  • 关联与相应的记录(一个或多个)版本号
  • 当有人打开文件编辑,跟踪版本号
  • 当有人试图保存文件时,请检查版本号。如果版本号与您检索的版本号相同,则保存,然后增加版本号但是如果版本号与您在打开文件时保存的版本号不相等,则会发生冲突;别人在你没有看的时候改变了记录。

  • 如果您有冲突,请求用户以某种方式解决它。

(这就是所谓的“乐观”,因为你假定大部分的时间你不会有两个用户试图在同一时间更新。)

pessimmistic版这将是一个锁的领域。当有人打开记录进行编辑时,请检查该字段;如果它是0,则可以编辑,但是在该字段中添加1。保存时,再次减1。如果它不是0,则拒绝让用户编辑。

+0

好主意,虽然这次我想我需要使用悲观锁定,因为我认为在我的情况下很可能会有2个人编辑文件。 – 2010-07-29 20:35:33

+2

请记住,对于任何锁定策略,在某些时候需要释放锁。通过网络应用程序,这是非常棘手的。如果他们只是关闭浏览器,记录保持锁定状态吗?应用程序如何知道?它保持锁定多久?清理会话超时,注销等所有打开的锁。 – 2013-02-07 18:24:20

+0

编辑记录时,每隔N秒运行一次AJAX请求以确认锁定。请注意,N必须小于过期期限。锁定时间戳更新以确保锁定未被释放。锁定确认与锁定一样。作为参考,http://webcheatsheet.com/php/record_locking_in_web_applications.php – 2013-03-21 02:45:30