在 TCL 中锁定 Metakit 数据库
Posted
技术标签:
【中文标题】在 TCL 中锁定 Metakit 数据库【英文标题】:Locking Metakit Database in TCL 【发布时间】:2011-09-12 19:47:57 【问题描述】:从 TCL 锁定 Metakit 数据库的首选方法是什么?
基本上我有一个从 Metakit 数据库文件读取/写入的应用程序,我担心如果用户运行我的应用程序的两个实例,他们可能会损坏数据库(通过同时进行两次写入) .
我知道我可以使用套接字在实例之间进行通信,但我不想这样做,因为这可能与 PC 上的现有软件发生冲突。我还考虑过使用锁定文件,但如果进程崩溃,数据库将被永久锁定。我知道在 UNIX 上将 PID 写入锁定文件很常见,但我不知道如何判断进程是否仍在以跨平台方式运行。我的主要目标是 Windows。
我并不完全反对添加一些本机代码(编译后的 C 二进制文件),但认为首先可能会有更好的纯 TCL 方式。
谢谢!
【问题讨论】:
【参考方案1】:使用锁文件并不少见;即使数据库崩溃会使数据库难以解锁。这个问题有一些简单的解决方法。
将锁放在重启后清理的地方;/tmp
用于 unix
如果应用打开后发现锁还开着;告诉用户发生了什么并建议如何解决它;提议删除锁定文件(在发出足够的警告后)或告诉用户它在哪里,这样他们就可以冒险自己删除它。
【讨论】:
【参考方案2】:Metakit page on commits 的描述说,有许多访问模式可用于允许多个读取器与单个写入器并发(可能使用引擎盖下的锁定)。标准的 metakit 相当谨慎,不会让其文件处于不一致的状态,所以我希望它能够很好地处理所有这方面的事情。我不知道该页面上讨论的功能是如何暴露给 Tcl 脚本的。
【讨论】:
以上是关于在 TCL 中锁定 Metakit 数据库的主要内容,如果未能解决你的问题,请参考以下文章