[8] [DFN[[RUBYB[ロック]@en[lock]]]]は、[[資源]]の操作権を管理する仕組みです。

* 仕様書

[REFS[
- [1] '''[CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-6>'''
-- [7] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-7.4>
- [44] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-9.6>
- [46] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.1>
- [23] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.6>
- [29] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.10>
- [32] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.11>
- [33] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.13>
- [38] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.15>
- [41] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#section-14.27>
- [49] [CITE@en[RFC 4918 - HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)]] ([TIME[2014-09-21 17:04:59 +09:00]] 版) <http://tools.ietf.org/html/rfc4918#appendix-D>
]REFS]

* 意味

[2] [[資源]]を[DFN[[RUBYB[[[ロック]]]@en[lock]]]] ([[動詞]]) することにより、
[[資源]]へのアクセスを[[直列化]]することができ、他の [[principal]]
が同時に[[資源]]を編集しないこと、すなわち [[lost update]] 問題を防ぐことができます。 [SRC[>>1]]

[5] [DFN[[RUBYB[[[ロック]]]@en[lock]]]] ([[名詞]]) は、
直接または間接に[[資源]]を[[ロック]]するものです [SRC[>>1]]。

[11] [[ロック]]は、大域的に固有な[[ロックトークン]]により識別されます [SRC[>>1]]。

* 分類

[3] [[ロック]]は、関与する [[principal]] の数により排他的か共有かに分類できます [SRC[>>1]]。

[13] [DFN[[RUBYB[[[排他的ロック]]]@en[exclusive lock]]]]は、
他の [[principal]] のアクセスを排除することによって、 [[WebDAV]]
の仕組みのみにより変更の[[衝突]]を防止するものです [SRC[>>1]]。

[15] [DFN[[RUBYB[共有ロック]@en[shared lock]]]]は、他の [[principal]]
が操作中であることを知らせるだけのものです。この場合 [[WebDAV]] 外の方法
(直接の対話や[[ポストイット]]、[[電子メール]]など) によって協調が必要かもしれません。 
[SRC[>>1]]

;; [16] 経験上、[[排他的ロック]]のみだと何らかの理由で[[ロック]]が解放されなくなる問題が起こりがちなため、
[[共有ロック]]が導入されました [SRC[>>1]]。[[排他的ロック]]でも[[タイムアウト]]や管理者操作で解除はできますが、
[[共有ロック]]の方がより便利です [SRC[>>1]]。

[4] [[ロック]]は、保証されるアクセスの種類によっても分類できます [SRC[>>1]]。
次の種類があります。
[FIG(short list)[
- [[書き込みロック]]
]FIG]

[17] [[WebDAV]] に従う[[資源]]は、
[[排他的ロック]]と[[共有ロック]]のいずれかおよびアクセスの種類の任意の組み合わせについて、
対応してもしなくても構いません。[[ロック]]にまったく対応しなくても構いません。 [SRC[>>1]]

;; [18] [[WebDAV]] の裏側で用いられているシステムで対応する[[ロック]]の手法が様々であることから、
実装の柔軟性を認めています [SRC[>>1]]。

[9] [[ロック]]は通常の[[資源]]にも、[[コレクション]]にも適用されます。

* 状態

[20] [[ロック]]は、次の情報を有します。
[FIG(short list)[
- [[ロックトークン]]
- [[ロック根]]
- [[ロック作成者]]
- [[ロックタイムアウト]]
]FIG]

[27] [[ロック]]に関係して次の[[特性]]があります。
[FIG(short list)[
- [CODE(URI)[[[DAV:supportedlock]]]]
- [CODE(URI)[[[DAV:lockdiscovery]]]]
]FIG]

* 操作

[6] [[ロック]]は [CODE(HTTP)@en[[[LOCK]]]] [[要求]]で作成できます。

;; [CODE(HTTP)@en[[[LOCK]]]] を参照。

[26] [[要求]]において[[ロック]]を[[提出]] ([CODE(HTTP)@en[[[If:]]]]
[[ヘッダー]]に[[ロックトークン]]を指定) することで、
[[ロック]]されている[[資源]]を操作できます。

[25] [[クライアント]]は [CODE(HTTP)@en[[[LOCK]]]] [[要求]]に
[CODE(HTTP)@en[[[If:]]]] [[ヘッダー]]で既存の[[ロックトークン]]を指定することで、
[[ロックタイムアウト]]の更新を求めることができます。
[[鯖]]は[[ロックタイムアウト]]の値を改めて決めて計測を開始します。

** ロックの削除

[12] [CODE(HTTP)@en[[[UNLOCK]]]] [[要求]]は、指定した[[ロックトークン]]の[[ロック]]を削除
(破棄) します。
[[ロック]]が削除されると、その[[ロック]]による[[資源]]の[[ロック]]は解除されます。 [SRC[>>1]]

[10] [[ロック]]されている[[コレクション]]についてある[[資源]]を[[メンバー]]でなくすると、
その[[資源]]は[[コレクション]]の[[ロック]]による間接的な[[ロック]]から除外しなければ[['''なりません''']]。 [SRC[>>1, >>7]]

[14] ある[[要求]]によって[[ロック]]の[[ロック根]]が[[写像]]されない [[URL]]
となった時、その[[ロック]]はその[[要求]]によって削除されなければ[['''なりません''']]。
[SRC[>>1]]

[45] [CODE(HTTP)@en[[[DELETE]]]] によって削除された[[資源]]を[[ロック根]]とする[[ロック]]は、
[CODE(HTTP)@en[[[DELETE]]]] の際に削除されます [SRC[>>44]]。

[21] [[ロック]]を削除できるのは、[[ロック作成者]]か、[[ロック]]を削除する[[特権]]を有する
[[principal]] です。

[22] [[ロックタイムアウト]]が経過したら、 [CODE(HTTP)@en[[[UNLOCK]]]]
[[要求]]により[[ロック]]が削除されたかのように動作しなければ[['''なりません''']] [SRC[>>1]]。

[50] [[ロック]]が破棄された場合、 [[LNR]] は削除されます [SRC[>>49]]。

;; [51] [[LER]] は削除されません。

* プロトコル

[19] 次の[[プロトコル要素]]が主に関係しています。
[FIG(short list)[
- [CODE(HTTP)@en[[[LOCK]]]]
- [CODE(HTTP)@en[[[UNLOCK]]]]
- [CODE(HTTP)@en[[[423]]]]
- [CODE(HTTP)@en[[[Lock-Token:]]]]
- [CODE(HTTP)@en[[[If:]]]]
- [CODE(XMLe)@en[[[lockinfo]]]]
- [CODE(XMLe)@en[[[lockentry]]]]
- [CODE(XMLe)@en[[[lockscope]]]]
- [CODE(XMLe)@en[[[locktype]]]]
- [CODE(XMLe)@en[[[exclusive]]]]
- [CODE(XMLe)@en[[[shared]]]]
- [CODE(XMLe)@en[[[lockroot]]]]
- [CODE(XMLe)@en[[[locktoken]]]]
- [CODE(HTTP)@en[[[no-conflicting-lock]]]]
- [CODE(URI)@en[[[DAV:supportedlock]]]]
- [CODE(URI)@en[[[DAV:lockdiscovery]]]]
]FIG]

* [CODE(XMLe)@en[lockscope]] 要素 (WebDAV)

[35] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の [DFN[[CODE(XMLe)@en[[[lockscope]]]]]]
[[要素]]は、[[ロック]]が[[排他ロック]]か[[共有ロック]]か指定するものです [SRC[>>33]]。

[36] [[内容]]は、[[要素内容]]であり、 [CODE(XMLe)@en[[[exclusive]]]] [[要素]]または
[CODE(XMLe)@en[[[shared]]]] [[要素]]です [SRC[>>33]]。

[FIG(railroad)[
= |
== [CODE(XMLe)@en[[[exclusive]]]]
== [CODE(XMLe)@en[[[shared]]]]
]FIG]

[30] [CODE(XMLe)@en[[[lockscope]]]] [[要素]]は [CODE(XMLe)@en[[[lockentry]]]]
[[要素]] [SRC[>>29]] や [CODE(XMLe)@en[[[lockinfo]]]] [[要素]] [SRC[>>32]]
の[[子要素]]として必要です。

[47] [CODE(XMLe)@en[[[lockscope]]]] [[要素]]は [CODE(XMLe)@en[[[activelock]]]]
[[要素]]の[[子要素]]として必要です [SRC[>>46]]。

* [CODE(XMLe)@en[locktype]] 要素 (WebDAV)

[39] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の [DFN[[CODE(XMLe)@en[[[locktype]]]]]]
[[要素]]は、[[ロック]]のアクセスの種別を指定するものです [SRC[>>38]]。

[40] [[内容]]は、[[要素内容]]であり、 [CODE(XMLe)@en[[[write]]]] [[要素]]です [SRC[>>38]]。

[FIG(railroad)[
= |
== [CODE(XMLe)@en[[[write]]]]
]FIG]

[31] [CODE(XMLe)@en[[[lockscope]]]] [[要素]]は [CODE(XMLe)@en[[[lockentry]]]]
[[要素]] [SRC[>>29]] や [CODE(XMLe)@en[[[locktype]]]] [[要素]] [SRC[>>32]]
の[[子要素]]として必要です。

[48] [CODE(XMLe)@en[[[lockscope]]]] [[要素]]は [CODE(XMLe)@en[[[activelock]]]]
[[要素]]の[[子要素]]として必要です [SRC[>>46]]。

* [CODE(XMLe)@en[exclusive]] 要素 (WebDAV)

[24] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の [DFN[[CODE(XMLe)@en[[[exclusive]]]]]]
[[要素]]は、[[排他ロック]]を指定するものです [SRC[>>23]]。

[28] この[[要素]]は、[[空要素]]です [SRC[>>23]]。

[34] この[[要素]]は [CODE(XMLe)@en[[[lockscope]]]] [[要素]]の[[子要素]]として使います [SRC[>>33]]。

* [CODE(XMLe)@en[shared]] 要素 (WebDAV)

[42] [CODE(URI)@en[[[DAV:]]]] [[名前空間]]の [DFN[[CODE(XMLe)@en[[[shared]]]]]]
[[要素]]は、[[共有ロック]]を指定するものです [SRC[>>41]]。

[43] この[[要素]]は、[[空要素]]です [SRC[>>41]]。

[37] この[[要素]]は [CODE(XMLe)@en[[[lockscope]]]] [[要素]]の[[子要素]]として使います [SRC[>>33]]。

[52] [CITE@en[RFC 5842 - Binding Extensions to Web Distributed Authoring and Versioning (WebDAV)]]
([TIME[2017-09-30 00:47:40 +09:00]])
<https://tools.ietf.org/html/rfc5842#section-9>

[53] [CITE@ja[【第570回】THE IDOLM@STER MillionRADIO 【アーカイブ】 - ニコニコ動画]]
([TIME[2024-09-10 14:14:49 +09:00]])
<https://www.nicovideo.jp/watch/so44032751>

[54] [CITE@ja[【第570回おまけ放送】THE IDOLM@STER MillionRADIO 【アーカイブ】 - ニコニコ動画]]
([TIME[2024-09-10 14:45:12 +09:00]])
<https://www.nicovideo.jp/watch/so44032807>