6. Locking (ロック)
リソースをロックする機能は、そのリソースへのアクセスをシリアライズするメカニズムを提供します。ロックを使用することで、オーサリングクライアントは、編集中に他のプリンシパルがリソースを変更しないという合理的な保証を提供できます。このようにして、クライアントは「更新の損失 (Lost Update)」問題を防ぐことができます。
本仕様では、ロックがクライアント指定の2つのパラメータに基づいて変化することを許可しています:関与するプリンシパルの数(排他ロック vs. 共有ロック)と、付与されるアクセスの種類。本文書では、1つのアクセスタイプのロックのみを定義しています:書き込み (Write)。ただし、構文は拡張可能であり、他のアクセスタイプのロックの最終的な仕様を許可します。
6.1 Lock Model (ロックモデル)
本セクションでは、WebDAVロックの非規範的な説明を提供します。
ロックはロックトークン (Lock Token) によって識別されます。ロックトークンはURLであり、HTTP経由で送信できます。1つのロックトークンは1つのロックのみに関連付けられます。
ロックは排他的 (Exclusive) または共有 (Shared) にすることができます。ロックのタイプは、サーバーがロックされたリソースに対するリクエストをどのように処理するかを決定します:
排他ロック (Exclusive Lock):
- ロックを作成したプリンシパルのみがリソースを変更できます
- 他のプリンシパルが競合するロックを取得することを防ぎます
共有ロック (Shared Lock):
- 複数のプリンシパルが共有ロックを保持できます
- 共有ロックを保持しているすべてのプリンシパルがリソースを変更できます
- ロックを保持していないプリンシパルがリソースを変更することを防ぎます
ロックは異なるスコープを持つことができます:
- 直接ロック (Direct Lock):ロックはリソースに直接適用されます
- 深度ロック (Depth Lock):ロックはリソースとそのすべてのメンバーに適用されます
コレクションの場合、深度 (Depth) を指定できます:
- Depth: 0:コレクション自体のみをロックします
- Depth: infinity:コレクションとそのすべてのメンバーをロックします(再帰的)
6.2 Exclusive vs. Shared Locks (排他ロックと共有ロック)
最も一般的なロックタイプは排他ロック (Exclusive Lock) です。排他ロックの目的は、特定のプリンシパルの編集ポリシーを強制することです。排他ロックの一般的な使用方法は、長時間のオーサリングセッション中に、異なるプリンシパルがリソースを変更するのを防ぐことです。
共有ロック (Shared Lock) は、プリンシパルのグループが同時にリソースを変更する必要がある協調オーサリングをサポートするように設計されています。共有ロックの主要な特性は、複数のプリンシパルが共有ロックを保持できることですが、排他ロックは他のすべてのロックを排除します。
ロック互換性テーブル:
| 現在の状態 | 共有ロックリクエスト | 排他ロックリクエスト |
|---|---|---|
| なし | ✅ 可能 | ✅ 可能 |
| 共有ロック | ✅ 可能 | ❌ 不可能 |
| 排他ロック | ❌ 不可能 | ❌ 不可能 |
6.3 Required Support (必須サポート)
サーバーは排他書き込みロック (Exclusive Write Lock) をサポートしなければなりません (MUST)。
サーバーは共有書き込みロック (Shared Write Lock) をサポートしてもよい (MAY) です。サーバーが共有書き込みロックをサポートしていない場合、クライアントが共有書き込みロックを要求したときに、サーバーはエラーを返さなければなりません (MUST)。
6.4 Lock Creator and Privileges (ロック作成者と権限)
ロックは、ロックを作成したプリンシパルに関連付けられます。適切なロックトークンを持つプリンシパルのみがリソースのロックを解除できます。これにより、ロック作成者がロックのライフサイクルを制御できることが保証されます。
ロックを作成するプリンシパルは、リソースにロックを作成する権限を持っている必要があります。具体的な権限要件は、サーバーのアクセス制御ポリシーによって決定されます。
6.5 Lock Tokens (ロックトークン)
ロックトークン (Lock Token) は、ロックを一意に識別するURLです。ロックトークンは通常、opaquelocktoken: URIスキームを使用します(付録Cを参照)。
ロックトークンの特性:
- グローバル一意性:各ロックトークンはグローバルに一意です
- 予測不可能性:ロックトークンは、不正なアクセスを防ぐために予測不可能であるべきです
- URL形式:ロックトークンは有効なURLです
ロックトークンの例:
opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
クライアントは次の方法でロックトークンを送信します:
Ifヘッダーにロックトークンを含めるLock-Tokenヘッダーにロックトークンを含める(UNLOCKメソッドのみ)
6.6 Lock Timeout (ロックタイムアウト)
ロックには有限のライフタイムがあります。サーバーは各ロックにタイムアウト値を割り当て、タイムアウト後にロックは自動的に期限切れになります。
タイムアウトの特性:
- クライアントは
Timeoutリクエストヘッダーでタイムアウト値を提案できます - サーバーはクライアントの提案を無視して、独自のタイムアウト値を割り当てることができます
- サーバーはロックレスポンスで実際のタイムアウト値を返さなければなりません (MUST)
- クライアントはロックをリフレッシュすることでロックのライフタイムを延長できます
タイムアウト形式:
Timeout: Second-4100
Timeout: Infinite
ベストプラクティス:
- サーバーはクライアントがロックをリフレッシュできるようにすべきです (SHOULD)
- クライアントは長期ロックを定期的にリフレッシュすべきです (SHOULD)
- クライアントは編集が完了したらリソースのロックを解除すべきです (SHOULD)
6.7 Lock Capability Discovery (ロック機能の発見)
リソースをロックしようとする前に、クライアントはOPTIONSメソッドを使用してサーバーのロック機能を発見できます。レスポンスの DAV ヘッダーは、ロックサポートを含むサーバーのWebDAV準拠クラスを示します。
6.8 Active Lock Discovery (アクティブロックの発見)
クライアントは、PROPFINDメソッドを使用して DAV:lockdiscovery プロパティを取得することで、リソース上のアクティブなロックを発見できます。このプロパティには、ロックタイプ、スコープ、深度、オーナー、タイムアウト、ロックトークンなど、リソース上のすべてのアクティブなロックに関する情報が含まれています。