php 赶上SQLite错误“数据库已锁定”

jchrr9hc  于 2023-04-28  发布在  PHP
关注(0)|答案(2)|浏览(191)

我打开一个SQLiteDB与以下语句在PHP什么是工作得很好。

$db2 = new SQLite3("/home/pi/ion.sqb", SQLITE3_OPEN_READONLY);
$resu2 = $db2->query("select * from test where name = 'Hans'");

然而,我不时地遇到以下错误消息::SQLite被锁定,PHP脚本通过以下致命消息杀死自己:

PHP Warning:  SQLite3::query(): Unable to execute statement: database is locked in /home/pi/ion.sqb on line 559
PHP Fatal error:  Uncaught Error: Call to a member function fetchArray() on boolean in /home/pi/dbc.php:560
Stack trace:
#0 {main}
  thrown in /home/pi/dbc.php on line 560

我试图检查数据库是否被锁定,并跳过选择。..但没有成功:

$db2 = new SQLite3("/home/pi/ion.sqb", SQLITE3_OPEN_READONLY);
$resu2 = $db2->query("select * from test where name = 'Hans'");
if (!$db2) {
    echo "DB DB-locked";
    }
else{ 
    $resu2 = $db2->query("select * from test where name = 'Hans'");
    while ($dsatz2 = $resu2->fetchArray(SQLITE3_ASSOC))
  ...

您可以运行到日志的SQLite DB中的问题是已知的。.当任何其它句柄处于写入模式时,也用于选择。
我怎么能在这种情况下,我的脚本运行到致命的错误,并结束自己?

PHP Fatal error:  Uncaught Error: Call to a member function fetchArray() on boolean in /home/pi/dbc.php:560
Stack trace:
#0 {main}
  thrown in /home/pi/dbc.php on line 560
btxsgosb

btxsgosb1#

这是一个偶然性问题。sqlite规范明确指出,在多进程(PHP就是这样,如果多个请求同时命中文件)或多线程环境中,如果两个SELECT查询同时命中同一个表,“后面”的查询将得到此错误。
不幸的是,在PHP中处理这个问题时,您没有太多的选择。我甚至不认为您可以在请求结束时结束的环境中启用共享缓存,所以即使这也是不可能的。
老实说,在这种情况下,我建议您使用微时间睡眠(比如说,您通常SELECT持续时间的一半时间),然后重试。

ajsxfq5m

ajsxfq5m2#

恐怕是晚了回答。
1.设置等待锁定数据库的超时时间。
例如,在运行任何查询之前:

$db2->busyTimeout(250);

参见:https://www.php.net/manual/en/sqlite3.busytimeout.php
1.使用WAL(从sqlite 3开始可用)。7)提高并发性。
例如:示例化后

$db2->exec('PRAGMA journal_mode = wal;');

相关问题