-
Notifications
You must be signed in to change notification settings - Fork 4
/
972.txt
185 lines (135 loc) · 9.39 KB
/
972.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
[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>
- [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>
]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]]。
* プロトコル
[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]]
の[[子要素]]として必要です。
* [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]]
の[[子要素]]として必要です。
* [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]]。