控制锁定Exclusive SQLite3数据库的超时

时间:2014-09-05 21:59:41

标签: vb.net sqlite locking

我有一个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包装器。

1 个答案:

答案 0 :(得分:0)

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终于通过我时,超时发生在其他地方。有时需要一脚才能让你开箱即用。 :-)