你可以实现一个锁,最简单的可能是向你想要锁定的数据添加两个字段(lock_created Datetime,locked_by int)。然后在编辑页面上(也可能在编辑按钮上)检查 (lock_created + lock_interval) < now() - 如果没有,数据被锁定以进行编辑,并且应该通知用户。(请注意,您始终需要在编辑页面上进行检查,而不仅仅是在编辑按钮上。)同样在提交页面上,您需要检查用户是否仍然拥有提交的锁定。(见下文。)
其中一个困难的部分是当有人编辑但未能在锁定间隔内提交时该怎么办。所以:
- lock_interval 为 2 分钟。
- 在时间 0:00 时,Alice 锁定了页面,编辑了一些东西,但接到了一个电话并且没有提交她的更改
- 在 2:30,Bob 检查了页面,因为 Alice 的锁已经过期,所以得到了编辑锁,并且编辑了
- 在 3:00 时,Alice 回到她的比赛中,按下提交 -> 冲突。
有人没有提交他们的数据。如果您将锁设置为过期,则无法解决此问题。(如果不这样做,锁可以永远保留。)您只能决定优先考虑哪个(使用 Bob 创建的新锁可能最简单)并通知另一个页面已过期并且数据将不会t 被提交,并将他们的编辑交还给他们以重做。
A note on the table structure: you could create a table 'locks' with fields 'table_name, row_id, lock_created, locked_by' but it probably won't be the easiest way, since joining on variable table names is complex and confusing. Also, there is probably no use to have a single place for all locks to be stored. For a simple mechanism, I think adding uniform fields to every table you want to implement the locking mechanism is easier all around.