首頁  >  問答  >  主體

關於sqlite3的事務控制問題

在封裝對sqlite3資料庫進行操作的方法時,測試程式碼如下:

$path = 'test.db';

$conn = new sqlite3($path);

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

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

    $conn-> query($sql);

}

由於想加入事務的控制,但是找來找去都沒有找到關於sqlite3這樣的方式,如何添加事務,都是用的new pdo()。本人之前一直寫java的,php目前還不熟悉,希望各位碼友能回答一下,謝謝啦。

逐日狂魔逐日狂魔2531 天前955

全部回覆(1)我來回復

  • 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 ),導致總控程式的全域變數被修改。

    具體還需進一步研究。

    回覆
    0
  • 取消回覆