У меня есть этот небольшой тестовый скрипт:Sqlite3, SQLSTATE [HY000]: Общая ошибка: 5 база данных заблокирована
session_start();
session_write_close();
error_reporting(-1);
register_shutdown_function(function() {
//echo 'shutdown';
});
$MAX = 120;
set_time_limit($MAX);
echo date('Y-m-d H:i:s').'<br>';
$m = microtime(true);
$file_db = new PDO('sqlite:'.dirname(__FILE__).'/test.sqlite3');
$file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$file_db->exec("CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, message TEXT, time INTEGER)");
$d = date('U');
do
{
$file_db->exec ('INSERT INTO messages VALUES (null, "titleee'.rand(1,9).'", "MESSAGEEEE'.rand(1,99).'", "'.rand(1,999).'")');
if (date('U') - $d > $MAX/2)
{
break;
}
} while (true);
$file_db = null;
echo 'ok: '.(microtime(true)-$m);
, если это выполняется в браузере в нескольких, например, рано или поздно он упадет «SQLSTATE [HY000 ]: Общая ошибка: исключение 5 базы данных заблокировано. Как уклониться от этого?
Добавить: sleep (2) после '$ file_db-> exec' Слишком много процессов пытаются слишком быстро вставить в базу данных, которая блокирует таблицу. –
Хм, не может ли он быть установленным, чтобы он «зависал», пока его не заблокировали? –
Никогда не использовал это, но вы можете попробовать: '$ file_db-> query (" SET LOCK MODE TO WAIT 120 ")' сразу же после создания экземпляра '$ file_db'. Это должно заставить скрипт ждать до двух минут, чтобы таблица разблокировалась ... –