2011-06-10 33 views
2

假設我有一個龐大的SQLite文件(比如500 [MB])。可以有10個不同的python實例同時訪問此文件更新不同的記錄它嗎?請注意,這裏的重點是不同記錄SQLite與Python的併發性?

例如,假設SQLite的文件有說1M行:

實例1將處理(和更新)行0 - 100000

實例2將將處理(和更新)行100001 - 200000

.........................

實例10將處理(和更新)行900001 - 百萬


含義,每個python實例只會更新文件的唯一子集。這工作,還是我會有嚴重的誠信問題?

回答

4

更新,感謝AndréCaron。

可以做到這一點,但讀操作支持併發SQLite中,因爲整個數據庫被鎖定在任何寫操作。在這種情況下,SQLite引擎將返回SQLITE_BUSY狀態(如果超過默認的訪問超時時間)。還要考慮到這很大程度上取決於對給定的操作系統和文件系統實施的文件鎖定程度。一般來說,我不會推薦使用建議的解決方案,特別是考慮到DB文件相當大,但您可以嘗試。

使用基於服務器進程的數據庫(MySQL,PostgreSQL等)來實現所需的應用程序行爲將會更好。

+2

SQLite常見問題清楚地解釋說,SQLite使用讀寫器鎖定,允許併發訪問。寫入序列化,但支持與寫入訪問**併發。 – 2011-06-10 04:23:30

+0

然而,我同意一般情況下,對SQLite數據庫的併發寫入訪問不是很安全(取決於對給定的操作系統和FS實施文件鎖定有多好)。 – 2011-06-10 04:32:39

+0

「整個數據庫在任何寫入操作上被鎖定」通常不會很長。特別是在啓用日誌功能的情況下,當日志刷新時,最多隻有幾十毫秒,即使如此,讀取操作仍然會成功。 – hayavuk 2017-03-10 13:19:50

4

有點。只有一個實例可以在任何時間寫入,這意味着併發寫入將被阻塞(請參閱SQLite FAQ)。你不會得到完整性問題,但我不確定你真的會從併發中受益,儘管這取決於你寫多少和讀多少。