クラスライブラリのメソッドでは,オブジェクトに接続するときに排他制御をするためのロックを設定します。ロックには,次の種類があります。
それぞれのロックによるオブジェクトの操作について説明します。
オブジェクトを参照するときに設定するロックです。あるクライアントがreadロックを設定して取り出したオブジェクトに対して,ほかのクライアントがwriteロックを設定してオブジェクトを更新,削除することはできません。ただし,readロックを設定してオブジェクトを参照することはできます。
readロックを設定したオブジェクトの操作について次の図に示します。
図3-64 readロックを設定したオブジェクトの操作
クライアントAがほかのクライアントより先に文書Xにreadロックを設定して参照している場合,そのほかのクライアントは文書Xにreadロックを設定して参照することはできますが,writeロックを設定して更新および削除することはできません。
オブジェクトを更新または削除する場合に設定するロックです。あるクライアントがwriteロックを設定して取り出したオブジェクトに対して,ほかのクライアントはreadロックまたはwriteロックを設定できません。したがって,writeロックを設定した以外のクライアントが,readロックまたはwriteロックを設定してオブジェクトを参照,更新または削除することはできません。
writeロックを設定したオブジェクトの操作について,次の図に示します。
図3-65 writeロックを設定したオブジェクトの操作
クライアントAがほかのクライアントより先に文書Xにwriteロックを設定して更新または削除しようとしている場合,そのほかのクライアントは文書Xにreadロックを設定して参照したり,writeロックを設定して更新および削除することはできません。
次の表に,複数のクライアント間でのロックの関係について示します。ここでは,クライアントAがオブジェクトにロックを設定している状態でほかのクライアントから設定できるロックの種類を示します。
表3-11 複数のクライアント間でのロックの関係
クライアントAが設定したロック | read | write | |
---|---|---|---|
ほかのクライアントが設定するロック | read | ○ | × |
write | × | × |
ロックは,次の時点まで継続します。
同一トランザクション内でのロックの遷移について説明します。ユーザが同一トランザクション内で一つのオブジェクトに異なる種類のロックを設定するメソッドを発行した場合,オブジェクトに設定されるロックは次の表に示すように遷移します。
表3-12 同一トランザクション内でのロックの遷移
設定済みのロック | read | write | |
---|---|---|---|
新たに設定しようとしたロック | read | readのまま | writeのまま |
write | writeに遷移 | writeのまま |
このように,すでにロックを設定しているオブジェクトに対して異なる種類のロックを設定しようとした場合は,強い種類のロックに変更しようとした場合だけ,ロックの種類が遷移します。