sqlite多線程并發(fā) sqlite能不能多線程并發(fā)訪問?
sqlite能不能多線程并發(fā)訪問?作為一個小型嵌入式數(shù)據(jù)庫,SQLite不提供復(fù)雜的鎖定機(jī)制。它不能在內(nèi)部管理多通道并發(fā)下數(shù)據(jù)操作的同步,更不能進(jìn)行優(yōu)化。因此,當(dāng)涉及到多通道并發(fā)時,需要外部讀寫鎖控制
sqlite能不能多線程并發(fā)訪問?
作為一個小型嵌入式數(shù)據(jù)庫,SQLite不提供復(fù)雜的鎖定機(jī)制。它不能在內(nèi)部管理多通道并發(fā)下數(shù)據(jù)操作的同步,更不能進(jìn)行優(yōu)化。因此,當(dāng)涉及到多通道并發(fā)時,需要外部讀寫鎖控制,否則SQLite會返回SQLiteBusy錯誤來拒絕請求。
返回SQLiteuuBusy主要有以下幾種情況:
1。當(dāng)有寫操作時,其他的讀操作將被拒絕
2。當(dāng)有寫操作時,其他寫操作將被拒絕
3。當(dāng)事務(wù)被打開時,在事務(wù)被提交之前,其他寫操作將被拒絕
4。當(dāng)一個事務(wù)被打開時,在提交該事務(wù)之前,其他事務(wù)請求將被拒絕
5。當(dāng)有讀操作時,其他寫操作將被拒絕
6。基于以上討論,我們可以看出這是一個典型的讀者-作者問題。讀操作應(yīng)該是共享的,寫操作應(yīng)該是互斥的,讀操作和寫操作也應(yīng)該是互斥的
可以設(shè)計以下解決方案來解決并發(fā)操作數(shù)據(jù)庫的鎖定問題,并保證讀操作可以保持最大的并發(fā)性
1。互斥用于控制數(shù)據(jù)庫寫入操作。只有具有互斥的線程才能操作數(shù)據(jù)庫
3。寫操作必須與互斥無關(guān)
4。讀取操作必須能夠共享互斥鎖,即在第一次讀取時獲取互斥鎖,在最后一次讀取時釋放互斥鎖http://blog.csdn.net/bestrem9/article/details/6322916
對于程序員來說,常用的關(guān)系數(shù)據(jù)庫有mysql、Oracle、DB2,使用sqllite的數(shù)據(jù)庫還比較少,但我現(xiàn)在用的項目是SQLite數(shù)據(jù)庫,SQLite是一個輕量級的關(guān)系數(shù)據(jù)庫,常用于嵌入式系統(tǒng),占用資源較少,支持主流操作系統(tǒng)Linux、windows,同時可以與主流編程語言Java、PHP等進(jìn)行通信。
然而,SQLite仍然有許多缺點。在相對復(fù)雜的查詢中沒有優(yōu)化器,其鎖的粒度也相對粗糙。如果寫入并發(fā)性很高,則必須選擇其他數(shù)據(jù)庫。當(dāng)然,由于SQLite的簡單性,它不支持高寫并發(fā)性。SQLite還有其他尚未實現(xiàn)的特性,如完整的修改表結(jié)構(gòu)支持、完整的觸發(fā)器支持、右外連接和所有外連接、可更新視圖等
SQLite許多未實現(xiàn)的特性和缺點不是不能實現(xiàn),而是如果可以實現(xiàn),它將失去簡潔的特點。SQLite和其他數(shù)據(jù)庫有什么區(qū)別?每個數(shù)據(jù)庫都是在特定的情況下使用的,會有優(yōu)缺點,優(yōu)缺點總是一樣的。
SQLite的讀寫效率很高,有哪些使用其他數(shù)據(jù)庫的理由?
下面簡要說明以下原因:
鎖定是因為操作不是原子的。讓我們用操作一來解釋它??聪旅鎯蓚€圖。
我這個操作需要
看上面的第二個圖,你能很清楚地理解這個過程嗎?
鎖定是為了確保上述三個步驟是原子操作。
回到問題上來,只有一個線程要寫,沒有競爭,所以不需要鎖定。
但是,如果你看第一張圖片,因為主內(nèi)存和本地內(nèi)存的存在
在一個線程寫入后,其他線程無法立即看到它。這就是可見性問題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。