當需要併發訪問資料庫資源時,為了確保資料的完整性,鎖定是很有必要的。而資料庫鎖定的級別有:列、行、頁面(或塊)、表、表空間以及整個資料庫。
鎖定級別又名鎖的粒度。一般情況,鎖的粒度越小,允許的併發訪問越多。但是,鎖是會佔據資源的,鎖的粒度越小,dbms就需要消耗更多的資源去維護鎖。
三種基本型別的鎖:共享鎖、獨佔鎖(排它鎖)和更新鎖。除此之外,還有一種鎖:意向鎖。
1.共享鎖
當讀取資料不需要更新時,dbms會採用共享鎖。允許多個程序或使用者訪問相同的資源。常見的用於select查詢語句。
2.獨佔鎖
當需要修改資料時,dbms會採取獨佔鎖。在同一時刻,允不許多個程序或使用者訪問相同的資源。
3.更新鎖
在修改資料前,一般是要進行讀取資料的,這時,dbms採取更新鎖。表示該資料可能被修改,這時,其他程序或使用者還是能讀取資料但不能修改資料。當資料真正修改時,dbms會把更新鎖公升級為獨佔鎖。
4.意向鎖
意向鎖能確保低優先順序鎖的使用壽命,並且,在一定程度上,意向鎖使識別表的鎖狀態的工作更加簡化。假如乙個程序對乙個表加持行獨佔鎖,加上意向鎖後,其他執行緒就不用遍歷每行來檢查是否有行獨佔鎖,只需檢查是否有意向鎖就行。
在併發開發資料庫時,死鎖是有出現的可能。出現死鎖的原因很簡單,當程序a持有a資源卻想訪問b資源,而與此同時程序b持有b資源也想訪問b資源,於是乎,雙方都在等待對方釋放手上的資源,死鎖就產生了。這時,dbms檢測到有死鎖後,就會把其中的一條程序當做犧牲品,強制釋放其資源來進行解鎖。
隔離等級為事務或語句指定鎖定行為。標準sql定義了四種隔離等級,可以用set transaction isolation level語句設定:
1.uncommitted read
uncommitted read 未提交讀,也就是「髒讀」。該等級可以讀取事務未提交但已更改的資料。
2.committed read
committed read 提交後讀。該等級不會讀取未提交事務的資料。
3.repeatable read
repeatable read 可重複讀。假如在一次事務中,需要多次讀取一張表的資料,而在兩次讀取之間,有可能會被其他事務更改了資料,導致前後讀取的資料不一致,這時,如果需要前後讀取的資料一致,就得使用repeatable read隔離。
4.serializable
serializable 序列化順序執行。可以說是上面三個的總和,在此模式下,效率就。。。
一般來說,隔離級別到達committed read就能解決大部分出現的問題。
程式設計師修煉之道閱讀筆記(四)
最真實的就是程式了,對就是對,錯就是錯,不會因為任何原因而改變。文章一直在提做乙個注重成效的程式設計師,注重成效的程式設計師會告訴自己,乙個錯誤的發生,就說明已經發生了很糟糕很糟糕的事情。每個程式設計師在編寫 時都會告訴自己一些不可能發生的事,因此在書寫時就把這些問題簡單化了,去不曾想在這些被忽略的...
專案管理修煉之道之規劃專案
管理層總是希望知道團隊什麼時候開發哪些特性,如何測量進度,以及什麼時候完成等諸多專案事項,作為專案經理就要滿足管理層的這些要求。所以,在專案之初,就必須要對專案進行規劃。對於那些成功的專案經理來說,他們習慣使用模板去進行管理專案,因為模板可以幫助他們避免遺漏下某些重要的東西。以下就是專案經理常用的規...
專案管理修煉之道之規劃專案
管理層總是希望知道團隊什麼時候開發哪些特性,如何測量進度,以及什麼時候完成等諸多專案事項,作為專案經理就要滿足管理層的這些要求。所以,在專案之初,就必須要對專案進行規劃。對於那些成功的專案經理來說,他們習慣使用模板去進行管理專案,因為模板可以幫助他們避免遺漏下某些重要的東西。以下就是專案經理常用的規...