2

私は、ツリーのようなデータ構造を維持する並行プログラムのために、きめの細かいロック機能の実装を支援するプログラミング ツールを開発しようとして学術研究を行っています。

たとえば、プログラマーは、ツリーのルート ノードを受け取り、ツリーを変更する関数を作成することができます (いくつかのルートをたどり、ノードを追加/削除することによって)。それらを解放できる場所-関数を同じツリーで同時に実行できます。

このような細粒度のロックが使用されている実際のコード例、またはパフォーマンスを向上させるために使用できるが、プログラマーが実装するのが面倒だった (たとえば、関数中にツリー全体をロックした) いくつかの実際のコード例を探しています。 -無駄なノードを解放せずに呼び出します)。

ツリー型のデータベースを使用する JCR と Jackrabbit について読み、JCR でノードをロックする方法を説明する記事を見つけました (例はありません): http://www.day.com/specs/jcr/2.0/17_Locking .html

私はデータベースのバックグラウンドが非常に少なく、Jackrabbit データベースと同時実行に関して何が許可され、何が許可されていないかを完全には理解していません。2 つのスレッドから同じノードにアクセスすることは許可されていませんが、異なるリポジトリについてはどうでしょうか? また、2 つの異なるクライアントが同じノードにアクセスしようとするとどうなりますか (たとえば、1 つは削除しようとし、もう 1 つはそれを変更しようとします。session.save() は失敗しますか?)。

ありがとう、オレン

4

1 に答える 1

2

まず第一に、データベース/ジャックラビット/ロックの間で混乱しないでください。Jackrabbit は、データベースと同様に独自のロックを実装しています。

Jackrabbit では、 を使用してノードをロックできますLockManager.lock()。パラメータを true に設定するisDeepと、その下にあるすべてのノードもロックされます。ロックされたノードは別のセッションで読み取ることができますが、変更することはできません。

技術的に言えば、2 つのスレッドが同じセッションを使用している場合、同じノードを編集できますが、これはかなり危険であり、おそらく回避する必要があります。

ノードが 2 つの同時セッションによって変更される可能性が高い場合は、常にノードをロックする必要があります。最後に到達したセッションは、ロックが解放されるまで待機する必要があります。ロックしないと、少なくとも 1 つのセッションで例外がスローされます。

異なるリポジトリからノードにアクセスするという意味がわかりません。ノードは 1 つのリポジトリにのみ属することができます。2 つの jackrabbit インスタンスが同じデータベースにアクセスすることを意味する場合は、これも避けるか、クラスタリングの使用を検討する必要があります。

ロックを実装する場合、設計と要件によって異なります。セッションが 1 つしかない場合はロックしても意味がありません。ノードまたはサブツリーをロックするかどうかは、データが何を表しているかによって異なります。たとえば、ノードがフォルダを表している場合、サブツリー全体ではなく、ノードだけをロックしたいでしょう。サブツリーが複雑なドキュメントを表す場合、おそらくサブツリーをロックする必要があります。

ツリー全体をロックすることに関しては、そうする人に会わないことを願っています!

于 2012-06-20T15:18:45.550 に答える