使用sqlite增加锁定超时,默认值是多少



当许多客户端在sqlite数据库上查询时,会出现一个众所周知的问题:数据库已锁定
我想在linux上加入等待锁定释放的延迟(以毫秒为单位(,以消除此错误。

从sqlite命令,我可以使用例如(4秒(:

sqlite> .timeout 4000
sqlite>

我已经启动了许多进行select/insert/delete的过程,如果我不使用sqlite命令设置这个值,有时我会得到:

sqlite> select * from items where code like '%30';
Error: database is locked
sqlite> 

那么.timeout的默认值是多少呢?

在Perl5.10程序中,我有时也会遇到这个错误,尽管默认值似乎是30.000(所以是30秒,没有记录(
在出现此错误之前,程序是否真的等待了30秒?如果是的话,这似乎很疯狂,那么即使在这个数据库上运行了许多其他进程,数据库也至少有一小部分是空闲的

my $dbh = DBI->connect($database,"","") or die "cannot connect $DBI::errstr";
my $to = $dbh->sqlite_busy_timeout(); # $to get the value 30000

谢谢!

DBD::Sqlite的默认繁忙超时在dbdimp.h中定义为30000毫秒。您可以使用$dbh->sqlite_busy_timeout($ms);进行更改。

sqlite3命令行shell的正常Sqlite默认值为0;也就是说,没有超时。如果数据库被锁定,它会立即出错。您可以使用.timeout mspragma busy_timeout=ms;进行更改。

超时工作如下:

处理程序将多次休眠,直到至少";ms";几毫秒的睡眠时间已经积累起来。在至少";ms";休眠毫秒,处理程序返回0,导致sqlite3_step()返回SQLITE_BUSY

如果您在超时30秒的情况下遇到繁忙的数据库错误,那么您只是在尝试获取大量使用的数据库文件上的锁时运气不好(或者某个东西正在运行真正的慢速查询(。如果你还没有使用WAL模式,你可能会考虑它。

最新更新