2016-03-04 32 views
-1

我打算編寫一個使用SQLite 3與數據庫進行通信的多線程應用程序。計劃數據庫由多個線程同時讀取和寫入。哪些語句屬於SQLite 3中的事務?

我想要做的事情之一是在事務中執行一系列語句。由於我的應用程序需要在語句之間執行應用程序邏輯以確定接下來要執行的語句,因此無法將這一系列語句組合爲單個查詢。至關重要的是,事務中所做的更改只能以原子方式在其他線程中可見,即無論是整個事務還是全部事務在任何時候都不可見。其中一些交易僅執行SELECT報表,其他交易也執行UPDATEINSERT報表。

現在我的計劃是讓所有線程同時使用一個對象sqlite3。無論何時線程需要執行事務,它都會從某處獲取一組準備好的語句,並根據需要執行它們。我確保一次沒有多個線程使用準備好的語句。

我發現sqlite_prepare而不是sqlite_step函數家族都允許我指定一個上下文來標識語句運行的事務。 (如果有的話)SQLite如何識別哪些語句屬於哪個事務?關於這個問題,文件沒有定論。

如果沒有辦法識別要在其中運行語句的事務,我相信我必須使用多個連接到同一個數據庫,因爲至少連接上下文標識了我的語句正在執行哪個事務。這需要有點不同的程序設計,這就是爲什麼我沒有開始編寫數據庫代碼,並且不能顯示任何代碼(因爲它不存在)。

回答

2

連接一次只能有一個事務。

所以如果你想隔離多個線程,你必須爲每個線程使用一個連接,或者串行化數據庫外的線程。

1

AFAIK是不是SQLite的工作方式。由於您以BEGIN開始交易,所有數據庫訪問都在交易中發生,直到您發出COMMITROLLBACK

sqlite3_get_autocommit()會告訴你你是否在交易中。

+0

這很有道理。所以如果我需要同時運行多個事務,我需要多次連接到同一個數據庫? – fuz

+0

我想是的,儘管我從未做過。我通常只使用一個連接和一個互斥體來避免併發數據庫更新 – qrdl

+0

我明白了。感謝您的幫助,我會在接受答案之前等待確定性更高的人。 – fuz