【发布时间】:2014-09-09 02:26:40
【问题描述】:
我有一个 SQLite 数据库,我想锁定它以进行同步。我不想要一个在不同的盒子上运行异步的进程,处理从不同的盒子添加的数据,直到它完成更新。 DataAccess 是一个连接到 sPackageFileName 的类,只要 sPackageFileName 相同或除非调用 .Close 方法,它就会重用相同的连接。所以基本上 DataAccess.ExecCommand 执行一个命令。 在谷歌我发现了这个....
DataAccess.ExecCommand("PRAGMA locking_mode = EXCLUSIVE", sPackageFileName)
DataAccess.ExecCommand("BEGIN EXCLUSIVE", sPackageFileName)
DataAccess.ExecCommand("COMMIT", sPackageFileName)
这就像广告一样。如果我在盒子 A 上运行它,然后在盒子 B 上运行它,我会得到一个“数据库锁定”异常。问题是需要多长时间。我发现了一个 PRAGMA busy_timeout。这个 PRAGMA 是超时控制访问锁,而不是数据库锁。我认为没有针对数据库锁定超时的 PRAGMA。现在似乎大约 3-4 分钟。另一个注意事项,sPackageFileName 不在任何一个盒子上,它们(盒子 A 和 B)通过共享驱动器连接到它。 我还在为 SQLite dll 使用 VB.NET 包装器。
【问题讨论】:
-
没有“访问锁”之类的东西; SQLite 只有一个数据库锁。
-
抱歉我的术语不好。似乎在我的研究中,SQLite 使用页面锁定来进行内部同步。可以记录,但对于这个问题并不重要。然后在执行 Begin 事务时有一个锁。然后是 pragma 锁定模式。Begin transaction 默认超时为 5 秒。我找到了一个可以改变那个的编译指示,但是我在锁定模式下遇到的超时更像是 3-4 分钟。我想要改变的那个。
-
没有页面或记录锁; SQLitealways uses a database lock.
-
有什么办法可以改变time_out?
-
使用 PRAGMA busy_timeout。那 3-4 分钟的等待不是来自数据库。