Heim  >  Fragen und Antworten  >  Hauptteil

Informationen zu Transaktionskontrollproblemen in SQLite3

Beim Kapseln der Methode zum Betreiben der sqlite3-Datenbank lautet der Testcode wie folgt:

$path = 'test.db';

$conn = new sqlite3($path);

$sql = 'insert into tb_test .. .';

for($i=0;$i<10000,$i++){

  $conn->query($sql);

}

Weil ich eine Transaktionskontrolle hinzufügen möchte, Aber ich habe keine Methode zu sqlite3 gefunden. Wie man Transaktionen hinzufügt, ist die Verwendung von new pdo(). Ich habe schon früher Java geschrieben und bin mit PHP noch nicht vertraut. Ich hoffe, dass alle Programmierer darauf antworten können, danke.

逐日狂魔逐日狂魔2531 Tage vor954

Antworte allen(1)Ich werde antworten

  • ringa_lee

    ringa_lee2017-10-21 09:51:38

    //sqlite3 事务的操作没有特别的接口函数,就是一个普通的 sql 语句而已,分别如下:
    int ret ; 
    ret = sqlite3_exec ( db , "begin transaction" , 0 , 0 , & zErrorMsg ); // 开始一个事务 
    ret = sqlite3_exec ( db , "commit transaction" , 0 , 0 , & zErrorMsg ); // 提交事务 
    ret = sqlite3_exec ( db , "rollback transaction" , 0 , 0 , & zErrorMsg );     
    
    //如果要进行大量的操作前使用如下语句 
    ret = sqlite3_exec ( db , "begin transaction" , 0 , 0 ,& zErrorMsg ); 
    for (...) {   
    //insert into operate     
    // 如果操作错误  
    ret = sqlite3_exec ( db , "rollback transaction" , 0 , 0 , & zErrorMsg )
     } 
     ret = sqlite3_exec ( db , "commit transaction" , 0 , 0 , & zErrorMsg );

    开发过程遇到这样的问题:

    分别对两个数据库文件的不同表进行操作,执行顺序为: open db A->begin trasaction->open db B->select from db B->close db B->select from db A->rollbak or commit->close db A

    测试发现, select from db B 这一步会出错,错误信息为library routine called out of sequence ,出错后执行rollback ,这一步也会报错。

    原来以为原因是:开始一个事务只能对一个数据库进行操作。

    测试发现,即使不开始事务,执行顺序为: open db A->open db B->select from db B->close db B->select from db A->close db A , 仍会出现ibrary routine called out of sequence 的错误。

    难道打开一个数据库,在关闭其之前不能打开其他数据库?

    难道sqlite 的并发执行需要用户自己来控制?

    今天发现,以上出错原因可能是总控程序和子程序的全局变量一致(都是sqlite3 *db ),导致总控程序的全局变量被修改。

    具体还需进一步研究。

    Antwort
    0
  • StornierenAntwort