Alfresco 如何为删除过程锁定节点

Alfresco 如何为删除过程锁定节点,alfresco,Alfresco,在alfresco中,我想删除一个节点,但不想被集群环境中的任何其他用户使用 我知道我将使用LockService锁定节点(在集群环境中),如下所示: lockService.lock(deleteNode); nodeService.deleteNode(deleteNode); lockService.unlock(deleteNode); 最后一行可能会导致异常,因为该节点已被删除,而且它确实会导致异常 操作期间发生系统错误:节点不存在:workspace://SpacesStore/c

在alfresco中,我想删除一个节点,但不想被集群环境中的任何其他用户使用

我知道我将使用LockService锁定节点(在集群环境中),如下所示:

lockService.lock(deleteNode);
nodeService.deleteNode(deleteNode);
lockService.unlock(deleteNode);
最后一行可能会导致异常,因为该节点已被删除,而且它确实会导致异常

操作期间发生系统错误:节点不存在:workspace://SpacesStore/cb6473ed-1f0c-4fa3-bfdf-8f0bc86f3a12


那么,在删除节点时,如何确保集群环境中的并发性,以防止两个用户同时访问同一节点,其中一个用户希望更新节点,第二个用户希望删除节点?

取决于您的集群环境(例如,所有Alfresco实例使用的同一个DB服务器),事务很可能只足以确保不使用过时的内容:

serverA(readNode)
serverB(deleteNode)
serverA(updateNode) <--- transaction failure

我认为没有必要锁定一个节点,因为这个节点将被删除,这个答案基于alfresco代码本身。你能给我一个关于JobLockService的例子吗?Skuro,我仍然对JobLockService感到困惑,JobLockService没有在节点中获得锁,它是锁定QName!!这正是重点:你不锁定一个节点,而是锁定一个QName。它是一种更通用的锁,与节点上的锁相比,更类似于
同步的
Java块。每次使用相同的
QName
获取作业锁时,您将在同一个锁上同步。如果我理解正确,那么当我谈论锁QName时,我谈论的是锁节点,而不是锁节点,例如JobLockService.getLock(“{URI}content”);然后,继承结构中cm:content类型及其子节点中的所有节点都将被锁定,直到操作启动完成。纠正我,斯库罗你是这个意思?如果我们知道QName是属性、关联、方面和类型的表示,那么会锁定什么呢?或者您在同步块中将QName上的锁定称为“键”!也就是说,同步(QName)意味着这里的QName将是同步块的密钥,它将阻止任何线程同时访问同一块,即使我们使用集群环境
serverA(acquireLock)
serverB(acquireLock) <--- wait for the lock to be released
serverA(readNode1)
serverA(if something then updateNode2)
serverA(updateNode1)
serverA(releaseLock)
serverB(readNode2)
serverB(releaseLock)