我正在将PHP 7.3.9与SQLite 3.22.0结合使用。
我为每个数据库操作创建了一个包装函数:
function do_db_stuff($callback) {
try {
// Acquire database lock
$db_lock = \fopen(DB_LOCK_PATH, "w+b");
\flock($db_lock, \LOCK_EX);
// New db object
$db = new \SQLite3(DB_PATH);
$bound_callback = \Closure::bind($callback, $db);
$return = $bound_callback();
$db->close();
return $return;
} finally {
\flock($db_lock, \LOCK_UN);
}
}
代码如下所示:
do_db_stuff(function() {
$this->exec("BEGIN");
$statement = $this->prepare("INSERT INTO test (...) VALUES (...");
$statement->bindValue(":field", "value");
$statement->execute();
$this->exec("COMMIT");
});
2-3个进程正在并行访问数据库:
我认为我的do_db_stuff
确保在任何给定时间只有一个进程正在访问数据库。
但是,我仍然偶尔会遇到“数据库已锁定”错误。
我不知道如何重现问题或原因。
非常感谢您的帮助。
编辑:
有了$db->exec('PRAGMA journal_mode = wal;');
,我得到:
attempt to write a readonly database
。