關於sqlite3的事務控制問題
逐日狂魔
逐日狂魔 2017-10-20 16:25:54
0
1
985

在封裝對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目前還不熟悉,希望各位碼友能回答一下,謝謝啦。

逐日狂魔
逐日狂魔

全部回覆(1)
ringa_lee
//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-&gt ;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 ),導致總控程式的全域變數被修改。

具體還需進一步研究。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板