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