而要實現(xiàn)事務(wù)蛾方,就不得不用到鎖暖释。一個SQLite數(shù)據(jù)庫文件有5種鎖的狀態(tài):
UNLOCKED:表示數(shù)據(jù)庫此時并未被讀寫灵份。
SHARED:表示數(shù)據(jù)庫可以被讀取哀军。SHARED鎖可以同時被多個線程擁有沉眶。一旦某個線程持有SHARED鎖打却,就沒有任何線程可以進(jìn)行寫操作。
當(dāng)線程擁有SHARED鎖沦寂,說明這個線程擁有對數(shù)據(jù)庫的讀的操作学密,對數(shù)據(jù)庫進(jìn)行寫操作的線程能進(jìn)行互斥操作
RESERVED:表示準(zhǔn)備寫入數(shù)據(jù)庫淘衙。RESERVED鎖最多只能被一個線程擁有传藏,此后它可以進(jìn)入PENDING狀態(tài)。
PENDING:表示即將寫入數(shù)據(jù)庫彤守,正在等待其他讀線程釋放SHARED鎖毯侦。一旦某個線程持有PENDING鎖,其他線程就不能獲取SHARED鎖具垫。這樣一來侈离,只要等所有讀線程完成,釋放SHARED鎖后筝蚕,它就可以進(jìn)入EXCLUSIVE狀態(tài)了卦碾。
EXCLUSIVE:表示它可以寫入數(shù)據(jù)庫了。進(jìn)入這個狀態(tài)后起宽,其他任何線程都不能訪問數(shù)據(jù)庫文件洲胖。因此為了并發(fā)性,它的持有時間越短越好坯沪。
一個線程只有在擁有低級別的鎖的時候绿映,才能獲取更高一級的鎖。SQLite就是靠這5種類型的鎖腐晾,巧妙地實現(xiàn)了讀寫線程的互斥叉弦。同時也可看出,寫操作必須進(jìn)入EXCLUSIVE狀態(tài)藻糖,此時并發(fā)數(shù)被降到1淹冰,這也是SQLite被認(rèn)為并發(fā)插入性能不好的原因。另外巨柒,read-uncommitted和WAL模式會影響這個鎖的機(jī)制榄棵。在這2種模式下,讀線程不會被寫線程阻塞潘拱,即使寫線程持有PENDING或EXCLUSIVE鎖疹鳄。