Sqlite3,SQLSTATE [HY000]:一般错误:5数据库被锁定

时间:2015-01-12 13:14:58

标签: php sqlite

我有这个小小的测试脚本:

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数据库被锁定”异常。如何躲闪它?

3 个答案:

答案 0 :(得分:2)

我有这个错误,因为我在SQLiteBrowser上有一个未保存的记录,然后SQLite不会在其上写。保存记录后,我的脚本恢复正常工作。因此,每次发生此错误时,请检查您的SQLiteBrowser(或任何其他编辑器)是否已启用并且是否有任何未保存的更改。

答案 1 :(得分:1)

sleep(2)之后添加:$file_db->exec太多进程试图过快地插入锁定表的数据库中。您可以在实例化$file_db->query("SET LOCK MODE TO WAIT 120")后立即尝试$file_db。这应该使脚本等待最多两分钟让表解锁...

答案 2 :(得分:1)

我将锁定问题跟踪到虚拟机网络文件共享问题:https://www.sqlite.org/lockingv3.html#how_to_corrupt

  

应该注意到,POSIX咨询锁定在许多NFS实现(包括最新版本的Mac OS X)上都存在错误甚至未实现,并且有报告称Windows下的网络文件系统存在锁定问题。最好的防御措施是不将SQLite用于网络文件系统上的文件。

我能够通过将SQLite数据库文件移动到未与主机操作系统(Windows)(Linux)目录来解决此问题>。

在我的情况下,我将SQLite数据库文件移动到Linux客户操作系统上的/tmp