我正在进行一项学术研究,试图开发一种编程工具,帮助实现细粒度锁定功能,用于维护树状数据结构的并发程序。
例如,程序员可能会编写一些接收树根节点并修改树的函数(通过遍历某些路径并添加/删除节点),该工具将帮助他找到代码中节点应该被锁定的位置,以及它们可以在哪里被释放 - 因此这些函数可以在同一棵树上同时执行。
我正在寻找一些现实生活中的代码示例,其中使用了这种细粒度锁定,或者可以使用它来获得更好的性能,但程序员太懒而无法实现它(例如,他在函数期间锁定了整个树) -调用而不释放无用的节点)。
我读到了 JCR & Jackrabbit,它们使用树形数据库,并找到了一篇解释如何在 JCR 中锁定节点的文章(但没有示例):http://www.day.com/specs/jcr/2.0/17_Locking.html http://www.day.com/specs/jcr/2.0/17_Locking.html
我对数据库的了解非常少,并且我不完全了解 Jackrabbit 数据库和并发性方面允许什么和不允许什么。不允许从2个线程访问同一个节点,但是不同的存储库怎么办?如果 2 个不同的客户端尝试访问同一节点(例如,一个尝试删除它,另一个尝试修改它 - session.save() 会失败吗?)会发生什么?
谢谢,
奥伦
首先,不要混淆数据库/jackrabbit/锁定。 Jackrabbit 实现了自己的锁定,数据库也是如此。
Jackrabbit 允许您使用以下方式锁定节点LockManager.lock()
。设置isDeep
参数为 true 意味着下面的所有节点也将被锁定。锁定的节点可以被另一个会话读取,但不能修改。
从技术上讲,如果两个线程使用相同的会话,它们可以编辑相同的节点,但这是相当危险的,应该避免。
如果一个节点可能被 2 个并发会话修改,那么您应该始终锁定该节点。最后到达那里的会话应该等待锁被释放。如果您不锁定,那么至少有一个会话将引发异常。
我不确定您所说的访问不同存储库的节点是什么意思。一个节点只能属于一个存储库。如果您的意思是有 2 个 jackrabbit 实例访问同一数据库,那么也应该避免这种情况,或者您应该考虑使用集群。
实现锁定时,这将取决于您的设计和要求。如果您只进行一次会话,那么锁定就没有意义,反之亦然。锁定节点还是子树将取决于您的数据代表什么。例如,如果一个节点代表一个文件夹,您可能只想锁定该节点而不是整个子树。如果子树代表复杂的文档,那么您可能需要锁定子树。
至于锁定整棵树,我希望我不会遇到这样做的人!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)