sqlite3使用事務處理 zz

2021-09-30 07:30:27 字數 1532 閱讀 8838

在對

sqlite3 insert into

等操作時速度比較慢。

原因:它以檔案的形式存在磁碟中,每次訪問時都要開啟一次檔案,如果對資料庫進行大量的操作,就很慢。

解決辦法:用事物的形式提交,因為開始事務後,進行的大量操作語句都儲存在記憶體中,當提交時才全部寫入資料庫,此時,資料庫檔案也只用開啟一次。如果操作錯誤,還可以回滾事務。

介面:事務的操作沒有特別的介面函式,就是乙個普通的

sql語句而已,分別如下:

intret

;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

(...)

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

具體還需進一步研究。

SQLITE3 使用總結6 事務處理

事務處理 sqlite 是支援事務處理的。如果你知道你要同步刪除很多資料,不仿把它們做成乙個統一的事務。通常一次 sqlite3 exec 就是一次事務,如果你要刪除1萬條資料,sqlite就做了1萬次 開始新事務 刪除一條資料 提交事務 開始新事務 的過程。這個操作是很慢的。因為時間都花在了開始事...

ASP中使用事務處理

asp中使用事務處理asp中隊資料庫表的操作 insert update delete 可使用事務處理,並支援多事務處理.在asp的資料庫物件鏈結物件中,提供了一下屬性 begintrans 事務開始 committrans 事務提交 rollbacktrans 事務回滾 on error resu...

ASP中使用事務處理

當一組語句構成乙個事物處理時,如果一條語句沒有成功執行,則所有的語句都不成功.例如,有人在 上購買商品,有關的交易資訊儲存在倆個表中,乙個表用來儲存購買者的信用卡資訊,另乙個表儲存要購買的商品資訊.當擁護購買商品時,他的信用卡號碼已經輸入到第乙個表中.但是,就在這時,伺服器出現了故障,第二個表沒有被...