sqlite多線程并發(fā) sqlite能不能多線程并發(fā)訪問?
sqlite能不能多線程并發(fā)訪問?作為一個(gè)小型嵌入式數(shù)據(jù)庫(kù),SQLite不提供復(fù)雜的鎖定機(jī)制。它不能在內(nèi)部管理多通道并發(fā)下數(shù)據(jù)操作的同步,更不能進(jìn)行優(yōu)化。因此,當(dāng)涉及到多通道并發(fā)時(shí),需要外部讀寫鎖控制
sqlite能不能多線程并發(fā)訪問?
作為一個(gè)小型嵌入式數(shù)據(jù)庫(kù),SQLite不提供復(fù)雜的鎖定機(jī)制。它不能在內(nèi)部管理多通道并發(fā)下數(shù)據(jù)操作的同步,更不能進(jìn)行優(yōu)化。因此,當(dāng)涉及到多通道并發(fā)時(shí),需要外部讀寫鎖控制,否則SQLite會(huì)返回SQLiteBusy錯(cuò)誤來(lái)拒絕請(qǐng)求。
返回SQLiteuuBusy主要有以下幾種情況:
1。當(dāng)有寫操作時(shí),其他的讀操作將被拒絕
2。當(dāng)有寫操作時(shí),其他寫操作將被拒絕
3。當(dāng)事務(wù)被打開時(shí),在事務(wù)被提交之前,其他寫操作將被拒絕
4。當(dāng)一個(gè)事務(wù)被打開時(shí),在提交該事務(wù)之前,其他事務(wù)請(qǐng)求將被拒絕
5。當(dāng)有讀操作時(shí),其他寫操作將被拒絕
6?;谝陨嫌懻摚覀兛梢钥闯鲞@是一個(gè)典型的讀者-作者問題。讀操作應(yīng)該是共享的,寫操作應(yīng)該是互斥的,讀操作和寫操作也應(yīng)該是互斥的
可以設(shè)計(jì)以下解決方案來(lái)解決并發(fā)操作數(shù)據(jù)庫(kù)的鎖定問題,并保證讀操作可以保持最大的并發(fā)性
1?;コ庥糜诳刂茢?shù)據(jù)庫(kù)寫入操作。只有具有互斥的線程才能操作數(shù)據(jù)庫(kù)
3。寫操作必須與互斥無(wú)關(guān)
4。讀取操作必須能夠共享互斥鎖,即在第一次讀取時(shí)獲取互斥鎖,在最后一次讀取時(shí)釋放互斥鎖http://blog.csdn.net/bestrem9/article/details/6322916
單線程:禁用所有互斥鎖,并發(fā)使用時(shí)會(huì)出錯(cuò)。SQLite是在編譯SQLite時(shí)添加的uThreadSafe=0參數(shù),或者在初始化SQLite之前調(diào)用sqlite3。配置(SQLITE配置單線程)。多線程:只要一個(gè)數(shù)據(jù)庫(kù)連接不被多個(gè)線程同時(shí)使用,它就是安全的。在源代碼中,bcoremutex被啟用,bfull mutex被禁用。實(shí)際上,這是為了禁用對(duì)數(shù)據(jù)庫(kù)連接和prepared語(yǔ)句的鎖定,因此同一個(gè)數(shù)據(jù)庫(kù)連接或prepared語(yǔ)句不能在多個(gè)線程中同時(shí)使用。SQLite是在編譯SQLite時(shí)添加的uThreadSafe=2是默認(rèn)啟用的。如果SQLite線程安全不是0。您可以在初始化SQLiteuConfig(SQLiteuConfig)之前調(diào)用SQLite3創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),設(shè)置SQLiteuOpenuNoMutex標(biāo)志。Serial:啟用所有鎖,包括bcoremutex和bfull mutex。因?yàn)閿?shù)據(jù)庫(kù)連接和準(zhǔn)備好的語(yǔ)句都被鎖定,所以多線程不可能同時(shí)使用這些對(duì)象,所以它們變成串行的。SQLite是在編譯SQLite時(shí)添加的uThreadSafe=1是默認(rèn)啟用的。如果SQLite線程安全不是0。可以在初始化SQLiteuConfig(SQLiteuConfig)之前調(diào)用SQLite3。創(chuàng)建數(shù)據(jù)庫(kù)連接時(shí),請(qǐng)?jiān)O(shè)置SQLiteuOpenuFullMutex標(biāo)志