Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

Lock コマンド (2)

通常の Lock は排他ロックです。これまで見てきたように、排他ロックは他のロックを妨げます。また、Caché は lock +^PersonD(id)#"s" 構文を使用して、共有ロックをサポートします。複数の処理は同じ共有ロックを取る場合もあります。しかし、共有ロックは排他ロックを妨げ、排他ロックは共有ロックを防げます。

Lock コマンドは、ロック・テーブルのエントリを確認、追加、削除するだけなので、Lock を使用する場合は、既存グローバルの名前を指定する必要すらありません。例えば、^PersonD を編集する際は常に、^PersonD が存在しなくても、(lock +^Person(id) の代わりに) lock +^Person(id) を実行できます。この場合は ^Person がロック・テーブルに追加されるので、同様に機能します。また、^PersonD 配列を編集するすべてのコードが ^Person をロックします。

このグローバルには個人データが含まれますが、個人データを編集する際に ^PersonI をロックする必要はありません。これは、実際に配列を “ロックしている” わけではなく、単にエントリをロック・テーブルに追加しているだけで、グローバルの編集を許可するコードをロックするためです。アプリケーションでは、^PersonD を更新するすべてのコードが、同じ規約を使用します。^PersonD を更新するコードはすべて必ず同時に ^PersonI も更新するため、lock +^PersonD(id) だけで十分です。

^PersonD(1) がロック・テーブルにある場合は、別のプロセスで ^PersonD(1) をロックすることはできません。ただし、^PersonD(2) はロックできます。つまり、ロック・テーブルには別のプロセスであれば兄弟のエントリを追加できます。しかし、別のプロセスはロック・テーブルの祖先のエントリをロックできません (この場合は ^PersonD)。これは、下位層のノードがロックされた場合は、その上位層の配列にもアクセスさせないためです。同様に、別のプロセスはロック・テーブルのエントリの子孫もロックできません (例 : ^PersonD(1,2))。ノード自身がロックされた場合は、そのノードの子孫にもアクセスさせないためです。

FeedbackOpens in a new tab