XRX/文件锁定
外观
< XRX
您希望建立系统以避免多个用户同时修改数据而导致覆盖彼此修改的问题。
考虑以下场景:Bob 将数据加载到他 XForms 应用程序的配置文件中,进行了部分修改,然后去吃午饭,并在午饭后才将数据保存回服务器。午饭时间,Alice 在她的 XForms 客户端打开相同的数据,做了一些修改并保存。当 Bob 午饭回来后,他对相同的数据进行了保存,从而覆盖了 Alice 的所有更新。
这被称为“丢失更新问题”,在多个用户可能同时编辑相同数据的场景中很常见。
解决此问题有许多策略,每种策略都有一些设计限制。
通常,您会发现两种独立的锁定策略,可以一起或独立使用。
第一个策略是在将数据移至客户端时对数据进行校验和。保存时,重新计算数据的校验和,并确保数据没有更改。您也可以将最后修改时间戳放入客户端,并在文件自用户开始编辑后发生更改时提醒用户。HTML 标头内的 etag 元素通常用于保存数据的 md5 校验和。
第二个策略是在编辑资源时设置服务器上的某些状态,并在用户未保存的情况下提供合理的超时时间。此方法始终更复杂,因为您必须处理解锁资源,这通常涉及用于查看锁定文件的工具和报告。
此处介绍的策略是在使用编辑表单时锁定文件,并在执行保存操作时解锁文件。
eXist 提供了一些简单的函数来锁定文件。此锁定可用于阻止第二位用户打开编辑会话。这种方法的缺点是,如果文件被锁定而用户没有进行保存,则必须创建一个工具来允许手动解锁记录。
以下是一些您可以在 eXist 上使用的锁定函数
util:exclusive-lock($a as node()*, $b as item()*) item()*
Puts an exclusive lock on the owner documents of all nodes in the first argument $a. Then evaluates the expressions
in the second argument $b and releases the acquired locks aftertheir completion.
util:shared-lock($a as node()*, $b as item()*) item()*
Puts a shared lock on the owner documents of all nodes in the first argument $a. Then evaluates the expressions
in the second argument $b and releases the acquired locks aftertheir completion.
xmldb:document-has-lock($a as xs:string, $b as xs:string) xs:string?
Returns the name of the user that holds a write lock on the resource specified in $b in the collection $a.
If no lock is in place, the empty sequence is returned. The collection can be passed as a simple collection path or an XMLDB URI.