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() 関数と Unlock() 関数 (2)

すべての Lock() コマンドは、ロック・テーブルのエントリを確認、追加、削除するだけなので、Lock() を使用する場合は、既存グローバルの名前を指定する必要はありません。例えば、^PersonD を編集する際は常に、^Person が存在しなくても、(lock(^PersonD(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