SQLite 数据库中的递归被锁定


Recursion in SQLite Database is locked

我用SQLite构建了类似树的东西。我在任务中使用递归:

$this->recursion($row['id']...

我的代码在旧的MySQL中工作,但在SQLite中则不然。

我收到致命错误:数据库已锁定...行,我有插入。
因为 SELECT 连接在插入之前使用数据库。
PHP 只插入一条记录。

我使用了BeginTransaction和Commit,我使用了busyTimeout。这对我没有帮助。

public function recursion($from, $to){
        $db = new SQLite3("db.sqlite");
        $stmt = $db->prepare('SELECT value, s_id, sex FROM table WHERE id='. $from);
        $result = $stmt->execute();
        $row = $result->fetchArray();
//'database is locked' in next line
        $db->exec('INSERT INTO table (id, s_id, value) VALUES (null,'. $to . $row['value'] .'");');     
        if ($row['sex']=='fem'){
            $stmt = $db->prepare('SELECT id FROM table WHERE s_id=' . $from);
            $result = $stmt->execute();
            while ($row = $result->fetchArray()){
                $this->recursion($row['id'], $db->lastInsertRowID());
            }
        }
}   


public function recursion($from, $to){      
        $res=mysql_connect($mysql_server,$mysql_user,$mysql_pass);
        mysql_select_db($mysql_db);
        $sql = 'SELECT value, s_id, s_id, sex FROM table WHERE id='. $from;
        $result = mysql_query($sql, $res);
        $row = mysql_fetch_array($result, MYSQL_ASSOC);
        mysql_query('INSERT INTO table (id, s_id, value) VALUES (null,'. $to . $row['value'] .'");', $res);     
        if ($row['sex']=='fem'){
            $sql = 'SELECT id FROM table WHERE s_id=' . $from;          
            $result = mysql_query($sql, $res);
            while ( $row = mysql_fetch_array($result, MYSQL_ASSOC) ) {
                $this->recursion($row['id'], mysql_insert_id());
            }
        }
}

我再说一遍,我的代码在MySQL中工作。

知道吗?有什么提示吗?谢谢。

你在递归函数内部做连接。第一次调用将打开/锁定数据库。然后,第一个递归调用将尝试重新打开数据库,然后 FAIL,因为它已在父上下文中打开。MySQL 代码之所以有效,只是因为您的递归深度不足以达到其连接限制。

您应该在递归函数之外打开数据库一次,然后只需在每个递归级别重用该句柄即可。MySQL也是如此。

很少有理由打开与数据库的多个连接。大约唯一合理的时间是需要使用不同的客户端凭据进行连接。