我有一个关于锁定的问题。这不仅仅与记录锁定有关,但无论如何。
假设我正在编写一个可访问网络的 CMS。我正在为一些想法而苦苦挣扎。
当用户打开文章进行编辑时,我可以将文章标记为“正在使用”。到目前为止,一切都很好。
但是我什么时候删除标志?用户何时保存文章?但是如果用户不想再打字并决定关闭浏览器并上床睡觉怎么办?
想到了一个超时机制,但是写一篇文章需要多长时间?10分钟太短,30分钟太长。。
也许我过于复杂了。我想听听你对这个问题的看法。
为什么不使用时间戳?实际上不必担心锁定任何内容,只需对记录(文章)更改的事件做出反应。
基本上,在保存文章之前,请检查您的版本(时间戳)是否与磁盘上的相同。如果相同,那么您仍然有最新的副本,因此请编写它,如果没有,则...提议合并,提议另存为新副本,丢弃它-特定于应用程序。
我的投票是尽可能地乐观锁定。
在我实施了实际锁的地方,我有一个管理页面来删除锁。服务器上还运行了一项服务来解锁任何没有相应活动会话的锁。
对 mssql 2005 及更高版本使用 rowversion,对 mssql 2000 及更低版本使用时间戳。对 postgresql 使用隐藏的 xmin 字段。
让所有其他用户打开记录。除了保存记录,标记谁保存它,并在 rowversion 的帮助下,在 catch(DbConcurrencyException) 上重新抛出一个错误,指示在他们之前保存记录的其他用户,并请求他们重新打开记录查看首先保存记录的用户所做的更改。