SQLite3:数据库已锁定

时间:2019-10-05 20:48:07

标签: php sqlite

我正在将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

0 个答案:

没有答案