mysql之事務隔離級別以及MVCC

  1.事務特性:ACID

    原子性:undolog--要麼全部成功,要麼全部失敗

     一致性:最核心和最本質的要求

    隔離性:MVCC(多版本併發控制)

    持久性:redo log

   

 

  2.事務的隔離級別

    事務的隔離級別有四種:讀未提交、讀已提交、可重複讀、序列化

    髒讀:事務B讀取到了事務A已修改但尚未提交的數據,還在這個數據基礎上做了操作,此時,如果A事務回滾,B讀取的數據無效,不符合一致性要求。

    不可重複讀:一個事務範圍內兩個相同的查詢卻返回了不同的數據 -----針對修改

    幻讀:事務A讀取到了事務B的新增數據,不符合隔離性-------針對新增和刪除

   3.隔離性引出MVCC

    MVCC:多版本併發控制、是爲了在讀取數據時不加鎖來提高讀取效率和併發性的一種手段。 

    數據庫併發場景:

      1.讀讀:不存在任何問題

      2.讀寫:有線程安全問題、可能出現髒讀、幻讀、不可重複讀

      3.寫寫:有線程安全問題,可能存在更新丟失等。

     MVCC解決的就是讀寫時的線程安全問題,線程不用去爭搶讀寫鎖。       Mysql兩種讀方式:

      當前讀:讀取的是數據的最新版本,而且要保證其他併發事務不能修改當前記錄,場景:lock in share mode,for update,updatedelete,insert

      快照都:不加鎖的非阻塞讀,讀取的是歷史版本的數據,不是最新的記錄,場景:不加鎖的select 

    MVCC:multi-Version concurrency control:多版本併發控制,用來解決併發讀寫的問題,不需要通過加鎖來解決 。

  

  MVCC不同事務隔離級別的不同表現:

    RC隔離級別下:當其他事務修改數據之後,可以看到修改之後的值

    RR隔離級別下:當其他事務修改數據之後,看不到修改之後的值 

  MVCC實現原理:

    MVCC模塊在Mysql中的具體實現是由三個隱式字段、undo日誌、read view三個組件來完成

    三個隱藏字段:

      DB_TRX_ID:6字節,最近修改事務id,記錄創建這條記錄或者最後一次修改該記錄的事務id

      DB_TOLL_PTR:7字節,回滾指針,指向這條記錄的上一個版本,用於配合undolog,指向上一個舊版本

      DB_ROW_ID:6字節,隱藏的主鍵,如果數據表沒有主鍵,那麼innodb會自動創建一個row_Id                   undo log: 

 

    undolog被稱之爲回滾日誌,表示在進行insert,delete,update操作的時候產生的方便回滾的日誌。

    當進行insert操作的時候,產生的undolog只在事務回滾的時候需要,並且在事務提交之後可以被立刻丟棄。

    當進行update和delete操作的時候,產生的undolog不僅僅在事務回滾的時候需要,在快照讀的時候也需要,所以不能隨便刪除,只有在快照讀或事務回滾不涉及該日誌時,對應的日誌纔會被purge線程統一清除(當數據發生更新和刪除操作的時候都只是設置一下老記錄的deleted_bit,並不是真正的將過時的記錄刪除,因爲爲了節省磁盤空間,innodb有專門的purge線程來清除deleted_bit爲true的記錄,如果某個記錄的deleted_id爲true,並且DB_TRX_ID相對於purge線程的read view可見,那麼這條記錄一定時可以被清除的)。

      readview:最大作用用來做可見性判斷 

  案例展示1: 

  案例展示2: 

    說明第二次select並沒有生成新的readview,而是沿用了第一次快照時刻的readview。 

  RR隔離級別能否解決幻讀問題?

  不能,產生幻讀的本質原因

  如果事務中都是用快照讀,那麼是不會產生幻讀問題的,但是當快照讀和當前讀一起使用的時候就產生了幻讀問題 

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