在封裝對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目前還不熟悉,希望各位碼友能回答一下,謝謝啦。
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 ),導致總控程式的全域變數被修改。
具體還需進一步研究。