gpt4 book ai didi

SQLITE ODBC 驱动程序和数据库锁定

转载 作者:行者123 更新时间:2023-12-03 19:25:00 25 4
gpt4 key购买 nike

我从 http://ch-werner.de/sqliteodbc/ 下载并安装了 SQLite ODBC 驱动程序.在一个问题上效果很好。如果另一个应用程序打开了数据库,我似乎无法获得排他锁。

我正在使用一个名为 Altium 的 CAD 应用程序。我正在尝试在 SQLITE 中构建一个原型(prototype)零件数据库来存放数据。我安装了上面提到的 ODBC 驱动程序,我可以很好地获取数据。问题是,如果我尝试在 SQLITEStudio 或 DB Browser for SQLITE 之类的应用程序中打开同一个数据库,我永远无法获得独占锁来写入新记录。 Altium 从不关闭它的连接,我不知道这是否是问题所在。

当我阅读 https://www.sqlite.org/lockingv3.html这似乎表明多个进程需要进行通信才能获得排他锁(写入所必需的)。这让我相信我的问题是第一个应用程序永远不会释放它的共享锁,因此第二个应用程序永远无法获得独占锁。我是否正确解释了这一点?

最佳答案

我在使用 SQLite 作为 Altium 数据库时遇到了同样的困难。当 Altium 打开并创建了与数据库的连接时,无法更新数据库文件。到目前为止,我发现了两种解决方法:

启用 Write Ahead Logging风格数据库杂志

默认数据库日志样式 DELETE 会临时创建数据库副本,写入数据库文件,并在验证写入时删除临时副本。

预写日志记录 WAL 将所有更改放在一个临时文件中,同时保留数据库的原始副本。访问数据库的进程解析数据库文件和 WAL 临时文件,并返回反射(reflect)所有更改的信息。我可以确认在 Altium 中进行数据库刷新时可以看到 Altium 之外的写入。

当检查点操作发生时,存储在 WAL 文件中的写入将写入原始数据库。当进程调用 PRAGMA wal_checkpoint; 时或者在 WAL Auto Checkpoint 设置指定的一些操作之后。

您可以在 DB Browser 中启用 WAL 日志模式的编辑编译指示选项卡:

DB Browser Database Settings

不过,问题仍然没有解决。 Altium 打开时,检查点数据库不起作用。数据库文件仍处于锁定状态,无法更改。

需要注意的是,我们希望在 Git 中备份和维护数据库文件的历史记录(是的,不推荐使用 Git)。在 Git 中不会跟踪对日志文件的写入,在检查点之前不会看到数据库文件中的更改。这意味着我们不能在 Altium 打开时从 Git 推送或拉取。我们可以跟踪数据库和日志文件,但另一个结果是没有数据更改的简单检查点将被 Git 视为更改。

使用替代的 ODBC 驱动程序

我测试了另一种专有的ODBC driver从德瓦特。当我将 Altium 配置为使用 devart 驱动程序连接到 SQLite 数据库时,无论日志设置如何,DB Browser 在 Altium 打开时写入文件都没有问题。 Altium 还可以通过刷新操作查看这些更改。

结论

克里斯蒂安·沃纳的 ODBC driver (从 0.9996 版开始)以 devart 驱动程序不锁定的方式锁定文件,即使 Atlium 通过驱动程序保持与数据库的连接。在某些情况下,WAL 日志模式可能是一种解决方法。

关于SQLITE ODBC 驱动程序和数据库锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45269190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com