SQLite3: база данных заблокирована - PullRequest
0 голосов
/ 05 октября 2019

Я использую 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...