我正在做一项学术研究,试图开发一种编程工具,帮助实现细粒度的锁定功能,用于维护树状数据结构的并发程序。
例如,程序员可以编写一些接收树根节点并修改树的函数(通过遍历一些路由和添加/删除节点),该工具将帮助他找到代码节点中应该锁定的位置以及可以释放它们的位置-因此这些函数可以在同一棵树上并发执行。
我正在寻找一些真实的代码示例,其中使用了这种细粒度的锁定,或者可以使用它来获得更好的性能,但程序员懒得实现它(例如,他在函数调用期间锁定了整个树,而没有释放无用的节点)。
我读到了关于JCR和Jackrabbit的文章,它们使用树形数据库,并且找到了一篇解释如何在JCR中锁定节点的文章(但没有示例):http://www.day.com/specs/jcr/2.0/17_Locking.html
我只有很少的数据库背景,我不能完全理解什么是允许的,什么是不允许的,当涉及到Jackrabbit数据库和并发时。从两个线程访问同一个节点是不允许的,但是不同的存储库呢?如果两个不同的客户端尝试访问同一节点(例如,一个客户端试图删除该节点,而另一个客户端试图修改该节点- session.save()会失败吗?)
谢谢,奥伦
发布于 2012-06-20 23:18:46
首先,不要混淆数据库/jackrabbit/locking之间的关系。与数据库一样,Jackrabbit也实现了自己的锁定。
Jackrabbit允许您使用LockManager.lock()锁定节点。将isDeep参数设置为true意味着下面的所有节点也将被锁定。锁定的节点可以被另一个会话读取,但不能修改。
从技术上讲,如果两个线程使用相同的会话,那么它们可以编辑相同的节点,但这是相当危险的,应该避免。
如果一个节点可能会被2个并发会话修改,那么您应该始终锁定该节点。任何最后到达那里的会话都应该等待锁被释放。如果你没有锁定,那么至少有一个会话会抛出异常。
我不确定你从不同的存储库访问节点是什么意思。一个节点只能属于一个存储库。如果你的意思是让两个jackrabbit实例访问同一个数据库,那么这也应该避免,或者你应该考虑使用集群。
在实现锁定时,它将取决于您的设计和需求。如果你只有一个会话,反之亦然,就没有点锁定了。锁定节点还是子树将取决于您的数据所代表的内容。例如,如果一个节点代表一个文件夹,您可能只想锁定该节点,而不是整个子树。如果一个子树表示一个复杂的文档,那么您可能希望锁定子树。
至于锁定整棵树,我希望我不会遇到这样做的人!
https://stackoverflow.com/questions/10851553
复制相似问题