文档锁定

Payload 的文档锁定功能确保同一时间只有一个用户可以编辑文档,从而防止数据冲突和意外覆盖。当文档被锁定时,其他用户无法进行更改,直到锁被释放,这样可以在协作环境中保证数据完整性。

当用户在 Admin Panel 中开始编辑文档时,锁定会自动触发,并保持有效直到用户退出编辑视图或由于不活动导致锁定过期。

工作原理

当用户开始编辑文档时,Payload 会为该用户锁定该文档。如果其他用户尝试访问同一文档,他们会收到该文档正在被编辑的通知。此时,他们可以选择以下操作之一:

  • 只读查看:只能查看文档,无法进行任何更改。
  • 接管编辑:从当前用户接管编辑权限,这将为新编辑者锁定文档并通知原始用户。
  • 返回 Dashboard:离开被锁定的文档,继续其他任务。

锁会在一段时间无操作后自动过期,这个时间可以通过 lockDocuments 配置中的 duration 属性进行设置。锁过期后,其他用户可以继续编辑。

注意: 如果你的应用不需要文档锁定功能,可以在任意 collection 或 global 上将 lockDocuments 属性设置为 false,以禁用该功能。

配置选项

lockDocuments 属性同时存在于 Collection Config 和 Global Config 上。document locking 默认启用,但你可以自定义锁定时长,或者为任意 collection 或 global 关闭该功能。

以下是 document locking 的配置示例:

import type { Collection Config } from 'payload'

export const Posts: CollectionConfig = {
  slug: 'posts',
  fields: [
    {
      name: 'title',
      type: 'text',
    },
    // other fields...
  ],
  lockDocuments: {
    duration: 600, // 单位为秒
  },
}

锁定选项

OptionDescription
lockDocuments为 collection 或 global 启用或禁用 document locking。默认情况下 document locking 是启用的。可以设置为对象进行配置,或设为 false 来禁用锁定功能。
duration指定文档在无用户交互情况下保持锁定的时长(以秒为单位)。默认为 300 秒(5 分钟)。

对 API 的影响

document locking 会影响 Local 和 REST API,确保当文档被锁定时,并发用户无法对该文档(包括 globals)执行更新或删除操作。如果用户尝试更新或删除被锁定的文档,将会收到错误提示。

一旦文档被解锁或锁定时长过期,其他用户就可以正常进行更新或删除操作。

覆盖锁定

对于 updatedelete 等操作,Payload 提供了 overrideLock 选项。当这个布尔标志设置为 false 时,会强制执行文档锁定,确保如果其他用户当前持有锁,操作将不会继续。

默认情况下,overrideLock 设置为 true,这意味着文档锁定会被忽略,即使文档被锁定,操作也会继续执行。要强制执行锁定并防止对锁定文档进行更新或删除,请设置 overrideLock: false

const result = await payload.update({
  collection: 'posts',
  id: '123',
  data: {
    title: 'New title',
  },
  overrideLock: false, // 强制执行文档锁定,如果文档被锁定则阻止更新
})

这个选项在需要管理员权限或特定工作流要求覆盖锁定并确保操作完成的场景中特别有用。