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

tro*_*our 2 database sqlite perl

许多客户端在 sqlite 数据库上查询时的众所周知的问题:数据库被锁定
我想增加在 Linux 上等待锁定释放的延迟(以毫秒为单位),以消除此错误。

从 sqlite-command 中,我可以使用例如(4 秒):

sqlite> .timeout 4000
sqlite>
Run Code Online (Sandbox Code Playgroud)

我已经启动了许多进行选择/插入/删除的进程,如果我不使用 sqlite-command 设置此值,我有时会得到:

sqlite> select * from items where code like '%30';
Error: database is locked
sqlite> 
Run Code Online (Sandbox Code Playgroud)

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

在 Perl 5.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
Run Code Online (Sandbox Code Playgroud)

谢谢!

Sha*_*awn 5

默认繁忙超时DBD::Sqlite定义为dbdimp.h30000 毫秒。您可以使用 更改它$dbh->sqlite_busy_timeout($ms);

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

超时的工作原理如下

处理程序将多次休眠,直到累积至少“ms”毫秒的休眠时间。休眠至少“ms”毫秒后,处理程序返回 0,这会导致sqlite3_step()return SQLITE_BUSY

如果即使有 30 秒的超时,您也遇到数据库繁忙错误,那么您只是运气不好,因为尝试在频繁使用的数据库文件上获取锁定(或者某些东西正在运行非常的查询)。如果还没有使用WAL 模式,您可以考虑一下。