首页/系统与基础设施/存储速查/文件锁与多客户端并发写冲突
NAS 与文件共享50 条

文件锁与多客户端并发写冲突

文件锁与缓存机制共同决定了多个写方同时操作同一文件的后果。锁冲突表现为「文件被占用」,而锁与缓存叠加时则可能悄无声息地产生内容丢失,后者更难发现。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​​‌‌​​‌‌​‌​​‌​‌‌​‌‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌​‌​‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

锁是协调手段,不是并发保护伞

SMB 提供字节范围锁与用于缓存协调的租约,NFSv3 用独立的锁协议、NFSv4 把锁并入协议本身。它们能让协作良好的应用互相避让,但都不会自动保护「同时覆盖写入」这种逻辑冲突:两个进程各自打开、各自写同一段内容,最终结果取决于执行顺序与缓存回收时机。共享目录不适合承载需要事务语义的数据,例如数据库文件。

基本信息

适用平台Windows SMB 共享、Samba、NFSv3/v4
SMB 侧字节范围锁、租约与机会锁
NFS 侧NFSv4 协议内锁与委托,NFSv3 依赖独立锁服务
查看命令Get-SmbOpenFile、smbstatus -L
关键事实不同协议的锁互不感知

现象与机制

现象可能机制处理方向
文件无法删除或重命名仍有进程持有句柄或存在独占打开定位持有者并让其释放
提示文件正被使用字节范围锁冲突协调写入顺序或改用应用级队列
内容被后写者覆盖无锁的并发写入改为分文件写入或加应用层互斥
读到旧内容缓存与租约尚未收回缩短缓存或关闭客户端缓存
跨协议访问异常SMB 与 NFS 锁不互通限制单一协议写入,其余只读

定位与查看

定位与查看
# Windows:找出持有文件句柄的客户端
Get-SmbOpenFile | Where-Object Path -like '*report.xlsx*' | Select-Object ClientUserName,ClientComputerName
# Samba:查看会话持有的锁
smbstatus -L
# Linux 本地查看哪些进程打开了该文件
lsof /srv/data/report.xlsx
# Samba 侧可按需调整机会锁与租约行为,具体参数以版本文档为准
testparm -s /etc/samba/smb.conf | head -n 20
把共享目录当数据库或虚拟机磁盘存放位置,是并发写导致数据损坏的典型场景。这类负载要求严格的写入顺序与锁语义,应使用块存储而非文件共享。
混合协议访问同一份数据时,锁与缓存都只在各自协议内生效:SMB 的租约不知道 NFS 的委托,因此一个协议上的写入可能不会及时让另一个协议的客户端看到变化。要避免这种情况,应约定同一目录只由一种协议写入,另一种保持只读。

易错点

  • 多台主机同时以覆盖方式写同一文件:没有锁参与时后写者覆盖前者,内容静默丢失
  • 用共享目录承载数据库文件:锁语义与写入顺序得不到保证,损坏概率高
  • SMB 与 NFS 同时挂载同一目录且都可写:两侧缓存与锁互相不可见,产生不一致
  • 只处理「文件被占用」的报错而不查持有者:定位不到根因,问题反复出现
  • 长时间保留独占打开的批处理:其他用户无法重命名或删除文件,影响日常操作

数据来源与参考

  • RFC 7530《NFS Version 4 Protocol》文件锁定章节
  • 微软 MS-SMB2 oplock 与 lease 章节
  • POSIX fcntl(2) 手册页文件锁语义

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/file-locking-concurrent-write.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​​‌‌​​‌‌​‌​​‌​‌‌​‌‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌​‌​‌‌​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​​‌​‌‌​‌​‌‌‌​‌‌‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​