使用细粒度锁的代码示例(JCR Jackrabbit?)

时间:2012-06-01 13:50:57

标签: concurrency tree jackrabbit jcr concurrent-programming

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

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

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

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

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

谢谢, 奥伦

1 个答案:

答案 0 :(得分:1)

首先,不要混淆数据库/长耳机/锁定。 Jackrabbit和数据库一样实现了自己的锁定。

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

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

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

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

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

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