鎖多併發排他訪問的時候產生,所以鎖和事務特性中的隔離性關係密切.隔離級別哪大致分四種.
讀未提交
讀已提交
可重複讀
可序列化
排他鎖爲了保證事務的完整一致, 排他鎖都是持續到事務結束的..
那麼就一起討論一下共享鎖在這四個隔離級別下是如何上鎖的.
讀未提交:
顧名思義,別人沒有提交我能讀,哪我讀取的時候不加共享鎖唄,
讀髒(脹數據是既沒有提交也沒有回滾的數據,中間狀態數據頁是在內存中還沒有redo到磁盤的數據,
當checkpoint被觸發時會批量寫入磁盤,然後在頁頭標記爲乾淨).
讀已提交:
顧名思義,別人提交了我才能讀,那麼我讀取的時候是加共享鎖的,
但是共享鎖是讀取一條釋放一條,這個鎖不會持續到事務結束.
可重複讀:
顧名思義,可以重複讀取嗎,
既然在一個事務內我可以重複讀取,其實意識就是在一個事務內多少此都一致,
那麼這個共享鎖是持續到事務結束..從start--commit 這段時間內共享鎖一直持有,
所以其他人修改不掉,纔會多次讀取一致。
可序列化:
如一張表主鍵id 1,2,3 3條數據我想在2-3之間插入一個2.5,
如果現在有人查詢select count(1) from tbname where id>=1 and id<=3時,
是不允許的,因爲這個隔離級別上的是範圍鎖這段時間不但數據不能修改, 這一段範圍也不能插入新的數據..
所以一個事務內count多少次都是3條數據, 如果這個表沒有主鍵,沒有聚集建怎麼上範圍所, 堆表無邏輯概念 ,
存放的就是物理位置 fileid:pageid:slotnumber ,如果堆表這個隔離級別讀取的時候就會加表鎖.
以上概述只限SQLSERVER 數據庫, mysql,postgresql採取的是樂觀併發, 默認讀老版本數據。
所以他的讀已提交默認讀取的是行的老版本。