在 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章

TCL数据类型

在sql server中获取死锁

从 Tcl 中的多个文件中读取特定数据

TCL编程的语法规则

TCL编程的语法规则

数据库中的dml ddl dcl tcl