确保两个人不在我的网络应用上编辑同一行的最佳方法是什么?

Mr *_*ish 14 php database ajax jquery

我有一个用于管理数据库的PHP/jQuery/AJAX/MySQL应用程序.我希望实现阻止多个用户同时编辑同一数据库行的功能.

  1. 这个叫什么?
  2. 我是否使用令牌系统,谁拥有令牌可以编辑它,直到他们释放令牌?
  3. 我是否使用"上次编辑日期/时间"来比较您将HTML表单加载到数据库中的时间,如果数据库是最重新编辑的,那么它会警告您?
  4. 我是否使用数据库函数锁定行?

我只是不确定哪个是最好的.假设有10到15个并发用户

Jus*_*ave 17

有两种通用方法 - 乐观和悲观锁定.

乐观锁定通常更容易在基于Web的环境中实现,因为它基本上是无状态的.它的扩展性也要好得多.缺点是它假定您的用户通常不会尝试同时编辑同一组行.对于大多数应用程序来说,这是一个非常合理的假设,但您必须验证您的应用程序不是用户经常踩到彼此脚趾的异常值之一.在乐观锁定中,当用户获取数据然后在更新日期时在子句中使用时,您将拥有某种last_modified_timestamp列,即SELECTWHERE

UPDATE table_name
   SET col1 = <<new value>>,
       col2 = <<new values>>,
       last_modified_timestamp = <<new timestamp>>
 WHERE primary_key = <<key column>>
   AND last_modified_timestamp = <<last modified timestamp you originally queried>>
Run Code Online (Sandbox Code Playgroud)

如果更新1行,则表示您已成功.否则,如果它更新了0行,你知道其他人在过渡期间修改了数据,你可以采取一些行动(通常向用户显示新数据并询问他们是否要覆盖,但你可以采用其他冲突解决方法).

特别是在基于Web的应用程序中,特别是当用户可以在不注销的情况下关闭浏览器或用户可能开始编辑某些数据并在点击之前去吃午餐时,悲观锁定更具挑战性Submit.它使得扩展更难,并且通常使应用程序更难管理.如果用户经常尝试更新相同的行,或者更新行需要花费大量时间给用户,那么真的值得考虑,因此值得让他们知道其他人已锁定该行.

  • +1:很好的答案.但是没有深入探讨 - 问题在于,通过优化锁定,很难检测用户何时访问记录并因此(因此获得了虚拟锁)但随后没有更新记录. (2认同)

nic*_*444 7

我打算将它实现到我自己的一个系统中.

您可以在记录数据库中创建新列,称为timelocked.

打开记录时,您可以将打开时间段的记录设置为当前时间.在编辑记录期间,每隔2分钟通过ajax将keepalive发送回服务器.发送keepalive时,服务器会将时间锁定时间增加到发送请求的当前时间,因此第四次(这将在一秒钟内有意义).用户完成编辑后,将timelocked设置为false.

现在,如果有人去打开已经打开的记录,那么php会检查 - 如果timelocked == false - 意味着它没有被编辑,

否则,可能正在编辑记录,但如果用户关闭了他们的浏览器窗口该怎么办.这就是使用keepalive的原因.

如果当前时间和时间锁之间的差异大于2分钟,则意味着它们不再是生动的编辑,这将允许您打开它.

希望你能理解这一切.