sqlite資料庫的鎖機制包括四種鎖,
共享鎖(shared lock)、預留鎖(reserved lock)和未決鎖(pending lock)、排他鎖(exclusive lock)
其中讀操作,用的是shared lock,所以併發的多個讀資料庫。如果有乙個讀操作存在,那麼都不會允許寫。
而寫就比較麻煩,
1.它首先會申請乙個預留鎖(reserved lock),在啟用reserved lock之後,已存在的讀可以繼續讀,也可以有新的讀請求。
2.然後,它會把需要更新的資料寫到緩衝區中。
3.需要寫到緩衝區的更新寫完以後,就需要將更新刷到硬碟db了。這時,它會申請pending lock,就不能再有新的shared lock申請了,也就是阻止了新的讀操作。但是已經存在的讀操作還是可以繼續讀的。然後它就等待,直到沒有讀操作存在(即所有的讀都已經結束)這個時候,它就會申請排他鎖,此時不允許有其他鎖的存在,然後進行commit,將緩衝區的資料寫入db中。
舉個死鎖的例子:
b進行寫操作,申請了預留鎖;然後a進行讀操作,申請了共享鎖(有預留鎖時,是允許讀操作申請的);然後a又同時想進行寫操作(未釋放共享鎖的情況),此時申請預留鎖(因為已經有預留鎖存在了)失敗;b寫完快取,想commit時,申請了未決鎖,但是無法從未決鎖提公升到排他鎖(因為有共享鎖存在)。此時,發生死鎖,a和b都想等待對方釋放鎖。
Sqlite資料庫的鎖
在sqlite中,鎖和事務是緊密聯絡的。為了有效地使用事務,需要了解一些關於如何加鎖的知識。sqlite採用粗放型的鎖。當乙個連線要寫資料庫,所有其它的連線被鎖住,直到寫連線結束了它的事務。sqlite有乙個加鎖表,來幫助不同的寫資料庫都能夠在最後一刻再加鎖,以保證最大的併發性。sqlite使用鎖逐...
資料庫鎖機制
這段時間由於開發專案,重新學習了資料庫的併發控制和鎖機制。資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否...
資料庫鎖機制
這段時間由於開發專案,重新學習了資料庫的併發控制和鎖機制。資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否...