鎖:多并發(fā)排他訪問的時候產(chǎn)生,
所以鎖和事務(wù)特性中的隔離性關(guān)系密切.
四種隔離級別:
讀未提交
讀已提交
可重復(fù)讀
可序列化
排他鎖:為了保證事務(wù)的完整一致, 排他鎖都是持續(xù)到事務(wù)結(jié)束的..
共享鎖加鎖機制
讀未提交:
顧名思義,別人沒有提交我能讀,哪我讀取的時候不加共享鎖唄,
讀臟(脹數(shù)據(jù)是既沒有提交也沒有回滾的數(shù)據(jù),中間狀態(tài)數(shù)據(jù)頁是在內(nèi)存中還沒有redo到磁盤的數(shù)據(jù),
當(dāng)checkpoint被觸發(fā)時會批量寫入磁盤,然后在頁頭標(biāo)記為干凈).
讀已提交:
顧名思義,別人提交了我才能讀,那么我讀取的時候是加共享鎖的,
但是共享鎖是讀取一條釋放一條,這個鎖不會持續(xù)到事務(wù)結(jié)束.
可重復(fù)讀:
顧名思義,可以重復(fù)讀取嗎,
既然在一個事務(wù)內(nèi)我可以重復(fù)讀取,其實意識就是在一個事務(wù)內(nèi)多少此都一致,
那么這個共享鎖是持續(xù)到事務(wù)結(jié)束..從start--commit 這段時間內(nèi)共享鎖一直持有,
所以其他人修改不掉,才會多次讀取一致。
可序列化:
如一張表主鍵id 1,2,3 3條數(shù)據(jù)我想在2-3之間插入一個2.5,
如果現(xiàn)在有人查詢select count(1) from tbname where id>=1 and id<=3時,
是不允許的,因為這個隔離級別上的是范圍鎖這段時間不但數(shù)據(jù)不能修改, 這一段范圍也不能插入新的數(shù)據(jù)..
所以一個事務(wù)內(nèi)count多少次都是3條數(shù)據(jù), 如果這個表沒有主鍵,沒有聚集建怎么上范圍所, 堆表無邏輯概念 ,
存放的就是物理位置 fileid:pageid:slotnumber ,如果堆表這個隔離級別讀取的時候就會加表鎖.
以上概述只限SQLSERVER 數(shù)據(jù)庫, mysql,postgresql采取的是樂觀并發(fā), 默認(rèn)讀老版本數(shù)據(jù)。
所以他的讀已提交默認(rèn)讀取的是行的老版本、