一、為什么二級封鎖協(xié)議不能保證可重復讀
排它鎖又叫寫鎖,事務(wù)A對數(shù)據(jù)D加了排它鎖,其它任何事務(wù)都不能再對數(shù)據(jù)D加共享鎖或者排它鎖。也就是說A可以讀取或者修改D,但是其它事務(wù)不能讀也不能寫,但是即使數(shù)據(jù)D加了寫鎖,其它事務(wù)的最基本的select語句還是可以讀數(shù)據(jù)D的,因為最基本的select語句并不用申請任何鎖!這個是最迷惑的地方,明白了這一點,一級封鎖協(xié)議協(xié)議會讀臟數(shù)據(jù)就很好理解了。
事務(wù)A對數(shù)據(jù)D=1加了排它鎖,修改了數(shù)據(jù)使D=2,這個時候事務(wù)B雖然不能對數(shù)據(jù)D加任何鎖,但是可以用select語句讀,B讀到了數(shù)據(jù)D=2,之后事務(wù)A出錯,回滾D=1,那你B就讀到了臟數(shù)據(jù)。
二級封鎖協(xié)議規(guī)定在一級的基礎(chǔ)上規(guī)定,事務(wù)A對數(shù)據(jù)D加了排它鎖,事務(wù)B想用基本的select語句讀D也必須要申請共享鎖(讀鎖)!!,而一級是不需要的!!,所以B在事務(wù)A沒結(jié)束期間都不能讀數(shù)據(jù)D,這樣就不會出現(xiàn)讀臟數(shù)據(jù)了!
但是二級卻不能保證可重復讀,這是因為,二級規(guī)定讀鎖是讀完就釋放!!而不是事務(wù)結(jié)束才釋放。比如B先對數(shù)據(jù)D=1加了讀鎖,讀完釋放了讀鎖,但是事務(wù)B并沒有結(jié)束,這時事務(wù)A對數(shù)據(jù)D加了寫鎖,然后修改D=2,釋放了寫鎖,這時,事務(wù)B再次對數(shù)據(jù)D申請讀鎖,讀到了D=2,同一個事務(wù),兩次讀取不一致,這就是二級為何不能保證可重復讀!
三級就是不是讀完就釋放,而是事務(wù)結(jié)束才釋放,這樣就可保證可重復讀了。
延伸閱讀:
二、什么是數(shù)據(jù)庫
有組織且相互關(guān)聯(lián)的數(shù)據(jù)的集合稱為數(shù)據(jù)庫。database 是一個存儲數(shù)據(jù)的應(yīng)用程序。它有各種應(yīng)用程序,包括 MySQL、Microsoft SQL、Oracle 等。
每個數(shù)據(jù)庫都不同,因為每個公司/組織都有其結(jié)構(gòu)、數(shù)據(jù)類型和約束。數(shù)據(jù)庫 會定期更新,以獲取有關(guān)公司的最新數(shù)據(jù)。
數(shù)據(jù)庫可以手動和數(shù)字方式維護。在這個數(shù)據(jù)無處不在的時代,數(shù)字數(shù)據(jù)庫是優(yōu)選和使用。數(shù)據(jù)庫的大小取決于組織的數(shù)據(jù)和需求。
數(shù)據(jù)庫有很多種類型,從最簡單的存儲有各種數(shù)據(jù)的表格到能夠進行海量數(shù)據(jù)存儲的大型數(shù)據(jù)庫系統(tǒng)都在各個方面得到了廣泛的應(yīng)用。
數(shù)據(jù)庫是“按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫”。在經(jīng)濟管理的日常工作中,常常需要把某些相關(guān)的數(shù)據(jù)放進這樣“倉庫”,并根據(jù)管理的需要進行相應(yīng)的處理。
例如,企業(yè)或事業(yè)單位的人事部門常常要把本單位職工的基本情況(職工號、姓名、年齡、性別、籍貫、工資、簡歷等)存放在表中,這張表就可以看成是一個數(shù)據(jù)庫。
有了這個”數(shù)據(jù)倉庫”就可以根據(jù)需要隨時查詢某職工的基本情況,也可以查詢工資在某個范圍內(nèi)的職工人數(shù)等等。這些工作如果都能在計算機上自動進行,那的人事管理就可以達到極高的水平。
此外,在財務(wù)管理、倉庫管理、生產(chǎn)管理中也需要建立眾多的這種“數(shù)據(jù)庫”,使其可以利用計算機實現(xiàn)財務(wù)、倉庫、生產(chǎn)的自動化管理。