pet*_*hen 8 windows linux filesystems nfs
作为文件损坏的常见原因,文档经常引用“NFS 没有正确实现文件级锁定”或类似的原因,例如,对于 SQLite:
如何损坏 SQLite 数据库文件,第 2.1 段
2.1 具有损坏或丢失锁实现的文件系统
SQLite 依赖于底层文件系统来进行锁定,正如文档所说的那样。但是一些文件系统在其锁定逻辑中包含错误,因此锁定并不总是像宣传的那样工作。这对于网络文件系统和 NFS 尤其如此。如果在锁定原语包含错误的文件系统上使用 SQLite,并且如果两个或多个线程或进程尝试同时访问同一个数据库,则可能会导致数据库损坏。
这 - 或类似的东西 - 十多年来经常被提及,通常在混合 Windows/Unix 环境中。但是,我从未发现任何迹象表明哪些网络文件系统(或客户端/服务器组合)实际上处于危险之中。
我可以告诉我的客户什么?
哪些网络文件系统没有正确实现锁定?
我相信正确的答案很简单:“全部”。
这应该限定于通过网络访问同一数据库的多台计算机上的多个进程的上下文。当访问数据库的所有进程都在同一台计算机上运行时,如果数据库引擎 (SQLite) 使用信号量或互斥体等排除工具(并正确使用它们......),则应该不会出现问题。
原因是锁定内容的信息通常保存在“进程 X 锁定 Y”的上下文中。当所有进程在同一台计算机上执行时,这可能非常有效,但当它们位于不同计算机上时,效果就不太好。
当一台计算机的进程访问另一台计算机上的文件时,本地操作系统会用自己替换远程进程,实际上充当它一无所知的进程的代理。它甚至可能难以区分在同一台远程计算机上执行的两个不同进程,并将其中一个进程误认为另一个进程。
为了正确锁定文件、整个文件或其中的一部分,确实需要一个在所有相关计算机上执行的操作系统,并具有用于文件锁的集中数据存储库。不幸的是,在一般情况下,Linux 和 Windows 都无法做到这一点。
您可以在旧文章《SQLite 版本 3 中的文件锁定和并发性》的“如何损坏数据库文件”部分中找到关于 SQLite 主题的更好的条约 。这详细介绍了 SQLite 用于确保 Windows 和 Linux 上的并发性的系统调用,既用于锁定文件部分,又用于将更新的数据从计算机刷新到数据库。所有列出的功能仅在一台计算机上才能正常工作。适当地,本文包含这句话“您最好的防御是不要对网络文件系统上的文件使用 SQLite”。
请注意,将数据刷新到数据库的问题尤其令人担忧,因为操作系统通常会延迟写入,因此您可能会遇到更新过程已刷新数据并释放锁的情况,但新数据可能尚未到达当另一个进程试图读取它时,它会被写入数据库,从而很容易以损坏的数据库结束。
更多信息可在 SQLite 文章 SQLite 中的原子提交的可能出错的事情部分中 找到。它增加了不同进程和计算机可能使用不同锁定机制的情况,其中一个进程和计算机不会阻止另一个进程和计算机。
在解决这个问题的数据库管理系统中,例如Oracle或SQL Server,解决方案是指定一台特定的计算机作为唯一可以更新数据库的计算机,因此锁定被大大简化。其他计算机网络系统(例如 Apache Hadoop) 提供自己的锁定机制来解决这些问题。
另一篇您会感兴趣的文章是《 论文件锁定的破坏》。
| 归档时间: |
|
| 查看次数: |
1179 次 |
| 最近记录: |