我打开一个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
2条答案
按热度按时间btxsgosb1#
这是一个偶然性问题。sqlite规范明确指出,在多进程(PHP就是这样,如果多个请求同时命中文件)或多线程环境中,如果两个
SELECT
查询同时命中同一个表,“后面”的查询将得到此错误。不幸的是,在PHP中处理这个问题时,您没有太多的选择。我甚至不认为您可以在请求结束时结束的环境中启用共享缓存,所以即使这也是不可能的。
老实说,在这种情况下,我建议您使用微时间睡眠(比如说,您通常
SELECT
持续时间的一半时间),然后重试。ajsxfq5m2#
恐怕是晚了回答。
1.设置等待锁定数据库的超时时间。
例如,在运行任何查询之前:
参见:https://www.php.net/manual/en/sqlite3.busytimeout.php
1.使用WAL(从sqlite 3开始可用)。7)提高并发性。
例如:示例化后