我有一个小测试脚本:
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]:General error: 5 database is locked”异常。如何避免?
$file_db->exec
后面添加sleep(2)
。有太多进程试图快速插入数据库,导致表被锁定。 - Justin E$file_db
后立即调用$file_db->query("SET LOCK MODE TO WAIT 120")
。这样可以让脚本等待最多两分钟以解除表锁定状态... - Justin E