【发布时间】:2015-01-12 13:14:58
【问题描述】:
我有这个小测试脚本:
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 数据库被锁定”异常。怎么躲?
【问题讨论】:
-
在
$file_db->exec之后添加:sleep(2) 太多进程试图太快地插入到锁定表的数据库中。 -
嗯,不能设置成“挂断”直到它没有被锁定吗?
-
从未使用过,但欢迎您在实例化
$file_db后立即尝试:$file_db->query("SET LOCK MODE TO WAIT 120")。这应该使脚本最多等待两分钟才能解锁表... -
我建议您在下面的答案中检查是否有未保存的更改。如果这样可以解决问题,并且如果它与需要的一样精确,请选择它作为此问题的答案。