2013-09-26 139 views
0

我一直在圍繞着關於多線程的SQLite文檔進行封裝,但還是不太明白。假設我有2個線程可以讀寫數據庫。我寫包含多個SQL語句的,所以我需要換他們明確的交易,是這樣的:在多線程環境中使用sqlite

sqlite3_exec (myDb, "BEGIN TRANSACTION", 0, 0, 0); 
// write stuff here 
sqlite3_exec (myDb, "COMMIT TRANSACTION", 0, 0, 0); 

第一個問題:我需要在交易包讀取操作對我來說,主要的要求是,直到寫入事務完成它應該不可能讀取一半的寫入數據

第二:我可以在兩個線程中使用一個數據庫連接嗎? - 看起來像我不能,因爲如果兩個線程正在寫入數據庫,因此兩個打開的事務第二個「BEGIN TRANSACTION」語句將失敗。

那麼什麼是正確的方法在這裏:使用自己的鎖定機制?每個線程使用一個連接? - 在這種情況下會發生什麼,我應該擔心SQL_BUSY/SQL_LOCKED嗎?

謝謝!

+0

[SQLite線程安全嗎?](https://sqlite.org/faq.html#q6) – 2013-09-26 05:39:35

回答

0

當兩個線程不能干擾彼此的事務時,您必須使用單獨的連接。

對於併發事務,可能會發生衝突,因此您應該設置繁忙超時或安裝繁忙處理程序。 如果所有連接都來自同一程序中的線程,則可以通過將所有事務封裝到互斥體中來避免衝突。