我最近将我的应用程序的工作区文件格式转换为sqlite。为了确保在NFS上运行稳健,我使用了一个通用的更新策略,我对存储在本地硬盘上临时位置的副本进行了所有修改。仅在保存时,我通过使用临时文件复制原始文件来修改原始文件(可能在NFS上)。我只打开原始文件以保持对它的独占锁定,以便其他人尝试打开它们将被警告其他人正在使用它。
问题是这样的:当我将我的临时文件保存回原始文件时,我必须释放原始文件上的锁,这为其他人提供了一个进入并取出原始文件的窗口,尽管是一个小窗口
我可以想到几个方法:
(1)通过使用sql简单地将temp的内容转储到原始文件,即在原始的vacumm原始文件上删除表,从temp中选择并插入原始文件。我不喜欢对存储在NFS上的sqlite文件进行sql操作。这让我害怕腐败问题。我是这样想的吗?
(2)使用各种额外文件作为防护装置,以防止其他人在复制原件上的温度时进入。将文件用作互斥锁充其量只是个问题。如果应用程序崩溃,我也不喜欢附加文件的想法。
我想知道是否有人对此有任何不同的解决方案。再次将临时文件复制到原始文件上,同时确保其他应用程序不会潜入并抓取原始文件这样做?
我正在使用python2.5,sqlalchemy 0.6.6和sqlite 3.6.20
谢谢, 迪安
答案 0 :(得分:1)
SQLite NFS问题是由于缓存和锁定中断。如果您的进程是唯一一个在NFS上访问该文件的进程,那么您就可以了。
SQLite备份API旨在解决您的问题。您可以直接备份到NFS数据库或另一个本地临时文件,然后复制它。备份API处理所有锁定和并发问题。
您可以使用APSW访问备份API或最新版本的pysqlite。 (披露:我是APSW的作者。)