php - PDO 3,多次运行:错误:17数据库架构已更改

标签 php sqlite pdo

我有这个测试代码:

session_start();
session_write_close();
set_time_limit(0);

for ($i = 1; $i < 1000; $i++)
{
    if (rand(1,5) == 1)
    {
        $file_db = new PDO('sqlite:x.db');
        $file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $file_db->exec('DROP TABLE IF EXISTS messages');
        $file_db = null;
    }
    $file_db = new PDO('sqlite:x.db');
    $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)');
    $file_db->query('INSERT INTO messages VALUES (null, "'.rand(1,9999).'", "'.rand(1,99).'", date("now"))');
    $file_db = null;
}

$file_db = new PDO('sqlite:x.db');
$file_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$i = 0;
foreach ($file_db->query('SELECT * FROM messages') as $m)
{
    $i++;
    echo $i.' -> '.$m['id'].'<br>';
}


使用此代码Im测试PDO 3是否可以使用多个并发。如果此代码在一个线程中运行,则一切正常。但是,一旦我启动了这两个实例,就会收到以下消息:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 17 database schema has changed' in code.php:* Stack trace: #0 code.php(*): PDO->query('INSERT INTO mes...') #1 {main} thrown in code.php on line *


错误行是INSERT INTO所在的位置。为什么会发生这种情况,以及如何避免这种情况发生? (我正在创建一个缓存系统,很可能会创建和删除表。我知道有TRUNCATE,我只是想知道为什么会这样)

最佳答案

[...]一旦我启动了这两个实例,就会收到以下消息:[...] SQLSTATE [HY000]:一般错误:17数据库架构已更改[...]为什么会发生以及如何发生闪避吗?


Sqlite是单个文件数据库。并行打开它,然后更改数据库结构。刚将表插入要插入时插入数据的操作不起作用,因为表已消失。这解释了为什么会发生。

就像您现在希望已经理解的那样,不可能插入到不存在的表中,该解决方案可能清晰可见:仅插入现有表中。

为确保在删除表后创建表,在事务中执行以下操作可能会有所帮助:https://www.sqlite.org/lang_transaction.html

关于php - PDO 3,多次运行:错误:17数据库架构已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27659719/

相关文章:

sqlite - 无法通过 ODBC 连接 Access 到 SQLite

php - 将代码片段插入数据库并在文本区域中以相同方式显示

android - 使用 alertdialog 构建器的 setCursor 方法显示数据库中的项目列表时如何添加多个列?

php - 根据 if 条件插入多行

php - 来自 Postgres SELECT SETOF 函数的重复记录

php - 执行 PDO 查询时出现错误

php - PHP pthreads如果至少有1个线程完成了该工作,则停止所有线程

javascript - emit() 不工作 [Node.js]

php - 克隆后动态下拉中断

php - 如何在没有鉴别器列的情况下从 Doctrine-Entity 进行扩展