瞭解鎖及上鎖時長

鎖多併發排他訪問的時候產生,所以鎖和事務特性中的隔離性關係密切.隔離級別哪大致分四種.

  1. 讀未提交

  2. 讀已提交

  3. 可重複讀

  4. 可序列化

排他鎖爲了保證事務的完整一致, 排他鎖都是持續到事務結束的..

那麼就一起討論一下共享鎖在這四個隔離級別下是如何上鎖的.

  1. 讀未提交:

    顧名思義,別人沒有提交我能讀,哪我讀取的時候不加共享鎖唄,

    讀髒(脹數據是既沒有提交也沒有回滾的數據,中間狀態數據頁是在內存中還沒有redo到磁盤的數據,

    當checkpoint被觸發時會批量寫入磁盤,然後在頁頭標記爲乾淨).

  2. 讀已提交:

    顧名思義,別人提交了我才能讀,那麼我讀取的時候是加共享鎖的,

    但是共享鎖是讀取一條釋放一條,這個鎖不會持續到事務結束.

  3. 可重複讀:

    顧名思義,可以重複讀取嗎,

    既然在一個事務內我可以重複讀取,其實意識就是在一個事務內多少此都一致,

    那麼這個共享鎖是持續到事務結束..從start--commit 這段時間內共享鎖一直持有,

    所以其他人修改不掉,纔會多次讀取一致。

  4. 可序列化:

    如一張表主鍵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採取的是樂觀併發, 默認讀老版本數據。

所以他的讀已提交默認讀取的是行的老版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章