【问题标题】:Control the timeout for locking Exclusive SQLite3 database控制锁定独占 SQLite3 数据库的超时时间
【发布时间】: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 分钟的等待不是来自数据库。

标签: vb.net sqlite locking


【解决方案1】:

CL 让我走上了正确的道路。这是 .NET 命令的超时。这是我的班级设置的代码。

   Dim con As DbConnection = OpenDb(DatabaseName, StoreNumber, ShareExclusive, ExtType)
   Dim cmd As DbCommand = con.CreateCommand()
   If _QueryTimeOut > -1 Then cmd.CommandTimeout = _QueryTimeOut

不要挂断变量,发布代码的目的是显示我可以显示我正在谈论的属性。默认 _QueryTimeOut 设置为 300(秒)。我将 cmd.ComandTimeout 设置为 1(秒)并按预期返回。

当 CL 终于联系到我时,超时发生在其他地方。有时需要一脚才能让你摆脱困境。 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2011-05-05
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多