2

我正在进行一项学术研究,试图开发一种有助于实现细粒度锁定功能的编程工具,用于维护树状数据结构的并发程序。

例如,程序员可能会编写一些函数来接收树根节点并修改树(通过遍历某些路由并添加/删除节点),该工具将帮助他找到代码中的哪些节点应该被锁定和它们可以在哪里被释放——所以这些函数可以在同一棵树上同时执行。

我正在寻找一些现实生活中的代码示例,其中使用了这种细粒度的锁定,或者它可以用于更好的性能但程序员懒得实现它(例如,他在函数期间锁定了整个树-调用而不释放无用的节点)。

我阅读了使用树形数据库的 JCR 和 Jackrabbit,并找到了一篇解释如何在 JCR 中锁定节点的文章(但没有示例): http ://www.day.com/specs/jcr/2.0/17_Locking .html

我在数据库方面的背景非常小,我不完全理解在 Jackrabbit 数据库和并发方面什么是允许的,什么是不允许的。不允许从 2 个线程访问同一个节点,但是不同的存储库呢?如果 2 个不同的客户端尝试访问同一个节点会发生什么(例如,一个尝试删除它,另一个尝试修改它 - session.save() 会失败吗?)。

谢谢,奥伦

4

1 回答 1

2

首先,不要混淆数据库/jackrabbit/locking。Jackrabbit 实现了自己的锁定,数据库也是如此。

Jackrabbit 允许您使用LockManager.lock(). 将该isDeep参数设置为 true 意味着下面的所有节点也将被锁定。锁定的节点可以被另一个会话读取,但不能被修改。

从技术上讲,如果 2 个线程使用同一个会话,它们可以编辑同一个节点,但这是相当危险的,应该避免。

如果一个节点可能被 2 个并发会话修改,那么您应该始终锁定该节点。哪个会话最后到达那里应该等待锁被释放。如果您不锁定,那么至少有一个会话将引发异常。

我不确定从不同存储库访问节点是什么意思。一个节点只能属于一个存储库。如果您的意思是让 2 个长耳兔实例访问同一个数据库,那么也应该避免这种情况,或者您应该考虑使用集群。

实施锁定时,将取决于您的设计和要求。如果您只有一个会话,则锁定是没有意义的,反之亦然。是否锁定节点或子树将取决于您的数据代表什么。例如,如果一个节点代表一个文件夹,您可能只想锁定该节点而不是整个子树。如果子树代表一个复杂的文档,那么您可能需要锁定子树。

至于锁定整棵树,我希望我不会遇到这样做的人!

于 2012-06-20T15:18:45.550 回答