2013-08-20 52 views
4

我正在運行SQLite v3.7.17從我的程序內存中模式和使用共享緩存(如在Shared Cache And In-Memory Databases中指定)。我的程序是多線程的,所有這些線程訪問相同的內存數據庫。如何實現內存中SQLite數據庫的行級鎖定?

有什麼辦法可以配置或使用我的SQLite數據庫,當兩個線程運行update查詢在同一個表(但不同的行),一個不會等待另一個?也就是說,我怎樣才能在這個內存數據庫上實現行級鎖定?

這在理論上應儘可能我的SQLite數據在一個文件中(因而文件系統寫做適用)。

+0

一個小的請求。請不要指出我的問題http://stackoverflow.com/questions/3267077/can-i-achieve-scalable-multi-threaded-access-to-an-in-memory-sqlite-database或任何類似於我的問題是完全不同的。 –

回答

2

這不是確定SQLite是否可以鎖定行的文件系統。這是SQLite的架構。

即使使用預寫式日誌記錄,you can only have one writer at a time

作者僅僅在WAL文件的末尾添加新內容。由於作家不做任何會干擾讀者行爲的行爲,因此作者和讀者可以同時運行。但是,由於只有一個WAL文件,所以一次只能有一個寫入器。

SQLite3 has a kind of table locking now,但不是行鎖定。

+0

看起來沒有辦法。 :-( –

1

這是在一個更大的跨國場景?因爲如果情況如你所描述的那樣簡單,那麼行鎖定和表鎖定沒有什麼優勢。

內存中的數據庫不受I/O延遲影響;它是CPU綁定的,並且CPU可以按順序處理這兩個寫入,這比它可以併發地處理它們更快,因爲後者具有所有相同的存儲器操作以及線程交換和行鎖定開銷。當然,在多CPU系統中,理論上可以同時寫入不同的行,但支持行鎖定的必要邏輯實際上需要比將記錄寫入存儲器的(平凡)操作更長的時間。

在任何大小的IMDB中,可以保留單個表上的表鎖以提高效率,同時可以在針對多個獨立表的多個獨立查詢中同時使用多個CPU。

+0

IMDB。使用內存中的數據庫一段時間,但從來沒有用過這個術語,很好。 – Chaithanya