我们在sqlite上遇到了一个奇怪的错误。我们在网络共享上使用sqlite数据库,其中有几台计算机访问它。我们的客户报告说,数据库已经消失。快速概述显示,数据库仍然存在,但没有计算机可以访问它。它还显示了一个s3db-journal文件,表明有人在发生某些事情时正在访问数据库。奇怪的是 - s3db-journal文件被文件系统锁定(我们无法复制/删除它)。重新启动所有应用程序后,锁定的文件应该会消失。
这是怎么发生的?我们想以某种方式扣除我们的客户如何陷入这种情况。我们知道,其中一台计算机出现了腐败的网络连接。
感谢您的帮助。
托拜厄斯
澄清一下:几个=最多10台计算机
答案 0 :(得分:0)
从“Appropriate uses for SQLite”页面:
如果有许多客户端程序通过网络访问公共数据库,则应考虑使用客户端/服务器数据库引擎而不是SQLite。 SQLite将在网络文件系统上运行,但由于与大多数网络文件系统相关的延迟,性能不会很好。此外,许多网络文件系统实现的文件锁定逻辑包含错误(在Unix和Windows上)。如果文件锁定不能正常工作,则两个或多个客户端程序可能同时修改同一数据库的同一部分,从而导致数据库损坏。因为这个问题是由底层文件系统实现中的错误引起的,所以SQLite无法阻止它。
一个好的经验法则是,在通过网络文件系统从多台计算机同时访问同一数据库的情况下,应避免使用SQLite。
很可能是您正在使用的网络文件系统中的错误。无论哪种方式,SQLite开发人员明确建议不要在网络文件系统上使用数据库。
答案 1 :(得分:0)
问题已解决。数据库组件(zeos)引发了异常,我们尝试了回滚。由于组件的设计方式,只有在启动事务时才允许这样做。如果没有,则会获得锁定的s3db-journal文件。
最后我们学到了两件事:当你没有开始交易时永远不会回滚,第二件事 - 来自zeos的函数InTransaction就是这样。