2011-08-03 13 views
0

アルフレコ内ではノードを削除したいが、クラスタ環境の他のユーザーは使用したくない。削除処理のためにノードをロックする方法

私はfolloingラインのように(クラスタ環境で)ロックのノードをLockServiceのを使用することを知っている:ノードがすでに削除されているので、最後の行は、例外が発生することがあり

lockService.lock(deleteNode); 
nodeService.deleteNode(deleteNode); 
lockService.unlock(deleteNode); 

、およびノードが存在しません:ワークスペース:// SpacesStore/cb6473ed-1f0c-4fa3-bfdf-8f0bc86f3a12

確かにそれは例外が

で、システムの操作中にエラーが起こった原因

どのように2人のユーザーが同じノードに同時にアクセスするのを防ぐためにノードを削除するときにクラスタ環境で並行性を保証するか、

+0

私はノードをロックする必要はありません。ノードは削除される予定ですが、この答えは屋外のコード自体に基づいています。 –

答えて

1

クラスタ環境(全てのAlfrescoのインスタンスで使用されるなど、同じDBサーバ)によっては、取引が最も可能性が高いだけで何の古いコンテンツが使用されていないことを確認するために十分であるかもしれない:

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

JobLockServiceは場合に、より制御することができます

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) 
+0

JobLockServiceの例を教えてください。 –

+0

Skuro、まだ私はJobLockServiceで混乱しています、JobLockServiceはQNameをロックしているノードでロックを取得しません!! –

+0

それはちょうどポイントです:あなたはノードでロックしないで、あなたはQNameをロックします。これはより一般的なロックであり、ノード上のロックよりも 'synchronized' Javaブロックに似ています。同じ 'QName'を使用してJobLockを取得するたびに、同じロックで同期します。 – skuro

関連する問題