Skip to main content

6. 锁定 (Locking)

锁定资源的能力提供了一种序列化访问该资源的机制。使用锁,创作客户端可以合理地保证在编辑资源时其他主体不会修改该资源。通过这种方式,客户端可以防止"丢失更新"问题。

本规范允许锁在两个客户端指定的参数上变化:涉及的主体数量(独占锁与共享锁)以及要授予的访问类型。本文档仅定义了一种访问类型的锁定:写入。但是,语法是可扩展的,允许最终为其他访问类型指定锁定。

6.1 锁模型 (Lock Model)

本节提供了WebDAV锁定的非规范性描述。

锁由锁令牌标识。锁令牌是URL,可以通过HTTP传输。锁令牌仅与一个锁关联。

锁可以是独占的或共享的。锁的类型决定了服务器如何处理对锁定资源的请求:

独占锁 (Exclusive Lock):

  • 只有创建锁的主体才能修改资源
  • 阻止任何其他主体获得冲突的锁

共享锁 (Shared Lock):

  • 多个主体可以持有共享锁
  • 所有持有共享锁的主体都可以修改资源
  • 阻止不持有锁的主体修改资源

锁可以具有不同的范围:

  • 直接锁 (Direct Lock): 锁直接应用于资源
  • 深度锁 (Depth Lock): 锁应用于资源及其所有成员

对于集合,可以指定深度:

  • Depth: 0: 仅锁定集合本身
  • Depth: infinity: 锁定集合及其所有成员(递归)

6.2 独占锁与共享锁 (Exclusive vs. Shared Locks)

最常见的锁类型是独占锁。独占锁的目的是强制执行特定主体的编辑策略。独占锁的常见用途是防止不同的主体在长时间的创作会话期间修改资源。

共享锁旨在支持协作创作,其中一组主体需要同时修改资源。共享锁的关键特征是多个主体可以持有共享锁,但独占锁排除所有其他锁。

锁兼容性表 (Lock Compatibility Table):

当前状态共享锁请求独占锁请求
✅ True✅ True
共享锁✅ True❌ False
独占锁❌ False❌ False

6.3 必需支持 (Required Support)

服务器必须支持独占写锁。

服务器可以支持共享写锁。如果服务器不支持共享写锁,当客户端请求共享写锁时,服务器必须返回错误。

6.4 锁创建者和特权 (Lock Creator and Privileges)

锁与创建锁的主体关联。只有具有适当锁令牌的主体才能解锁资源。这确保了锁创建者对锁的生命周期有控制权。

创建锁的主体需要具有在资源上创建锁的特权。具体的特权要求由服务器的访问控制策略确定。

6.5 锁令牌 (Lock Tokens)

锁令牌是唯一标识锁的URL。锁令牌通常使用opaquelocktoken: URI方案(见附录C)。

锁令牌特征 (Lock Token Characteristics):

  • 全局唯一性 (Global Uniqueness): 每个锁令牌都是全局唯一的
  • 不可预测性 (Unpredictability): 锁令牌应该是不可预测的,以防止未经授权的访问
  • URL格式 (URL Format): 锁令牌是有效的URL

锁令牌示例 (Example Lock Token):

opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

客户端通过以下方式提交锁令牌:

  • If头中包含锁令牌
  • Lock-Token头中包含锁令牌(仅用于UNLOCK方法)

6.6 锁超时 (Lock Timeout)

锁具有有限的生命周期。服务器为每个锁分配一个超时值,之后锁会自动过期。

超时特征 (Timeout Characteristics):

  • 客户端可以在Timeout请求头中建议超时值
  • 服务器可以忽略客户端的建议并分配自己的超时值
  • 服务器必须在锁响应中返回实际的超时值
  • 客户端可以通过刷新锁来延长锁的生命周期

超时格式 (Timeout Format):

Timeout: Second-4100
Timeout: Infinite

最佳实践 (Best Practices):

  • 服务器应该允许客户端刷新锁
  • 客户端应该定期刷新长期锁
  • 客户端应该在编辑完成时解锁资源

6.7 锁能力发现 (Lock Capability Discovery)

在尝试锁定资源之前,客户端可以使用OPTIONS方法发现服务器的锁定能力。响应中的DAV头指示服务器的WebDAV合规性类别,其中包括锁定支持。

6.8 活动锁发现 (Active Lock Discovery)

客户端可以使用PROPFIND方法检索DAV:lockdiscovery属性来发现资源上的活动锁。此属性包含有关资源上所有活动锁的信息,包括锁类型、范围、深度、所有者、超时和锁令牌。