在封裝對(duì)sqlite3資料庫(kù)進(jìn)行操作的方法時(shí),測(cè)試程式碼如下:
$path = 'test.db';
$conn = new sqlite3($path);
$sql = 'insert into tb_test...';
for($i=0;$i<10000,$i ){
????$conn-> query($sql);
}
由於想加入事務(wù)的控制,但是找來(lái)找去都沒(méi)有找到關(guān)於sqlite3這樣的方式,如何添加事務(wù),都是用的new pdo()。本人之前一直寫(xiě)java的,php目前還不熟悉,希望各位碼友能回答一下,謝謝啦。
//sqlite3?事務(wù)的操作沒(méi)有特別的接口函數(shù),就是一個(gè)普通的?sql?語(yǔ)句而已,分別如下: int?ret?;? ret?=?sqlite3_exec?(?db?,?"begin?transaction"?,?0?,?0?,?&?zErrorMsg?);?//?開(kāi)始一個(gè)事務(wù)? ret?=?sqlite3_exec?(?db?,?"commit?transaction"?,?0?,?0?,?&?zErrorMsg?);?//?提交事務(wù)? ret?=?sqlite3_exec?(?db?,?"rollback?transaction"?,?0?,?0?,?&?zErrorMsg?);????? //如果要進(jìn)行大量的操作前使用如下語(yǔ)句? ret?=?sqlite3_exec?(?db?,?"begin?transaction"?,?0?,?0?,&?zErrorMsg?);? for?(...)?{??? //insert?into?operate????? //?如果操作錯(cuò)誤?? ret?=?sqlite3_exec?(?db?,?"rollback?transaction"?,?0?,?0?,?&?zErrorMsg?) ?}? ?ret?=?sqlite3_exec?(?db?,?"commit?transaction"?,?0?,?0?,?&?zErrorMsg?);
開(kāi)發(fā)過(guò)程遇到這樣的問(wèn)題:
分別對(duì)兩個(gè)資料庫(kù)檔案的不同表進(jìn)行操作,執(zhí)行順序?yàn)椋?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
測(cè)試發(fā)現(xiàn),?select from db B?這一步會(huì)出錯(cuò),錯(cuò)誤訊息為library routine called out of sequence?,出錯(cuò)後執(zhí)行rollback?,這一步驟也會(huì)報(bào)錯(cuò)。
原來(lái)以為原因是:開(kāi)始一個(gè)交易只能對(duì)一個(gè)資料庫(kù)進(jìn)行操作。
測(cè)試發(fā)現(xiàn),即使不開(kāi)始事務(wù),執(zhí)行順序?yàn)椋?open db A->open db B->select from db B->close db B->select from db A-> close db A?,?仍會(huì)出現(xiàn)ibrary routine called out of sequence?的錯(cuò)誤。
難道打開(kāi)一個(gè)資料庫(kù),在關(guān)閉其之前不能打開(kāi)其他資料庫(kù)?
難道sqlite?的同時(shí)執(zhí)行需要使用者自己來(lái)控制?
今天發(fā)現(xiàn),以上出錯(cuò)原因可能是總控程式和子程式的全域變數(shù)一致(都是sqlite3 *db?),導(dǎo)致總控程式的全域變數(shù)被修改。
具體還需進(jìn)一步研究。