Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

Lock コマンド (2)

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

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

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

既定の Lock は排他ロックです。これまで見てきたように、排他ロックは他のロックを妨げます。また、InterSystems IRIS は lock +^PersonD(id)#"s" 構文を使用して、共有ロックをサポートします。複数の処理は同じ共有ロックを取る場合もあります。しかし、共有ロックは排他ロックを妨げ、排他ロックは共有ロックを防げます。共有ロックは、1 つ以上のプロセスが同じレコードを表示しているときに、他のプロセスがそのレコードを編集できないようにするのに便利です。

FeedbackOpens in a new tab