mysql實戰45講筆記--08

08 事務到底是隔離的還是不隔離的
(理論,多讀)

        Mysql裏,有兩個“視圖”的概念
        1.一個是view,他是一個用查詢語句定義的虛擬表,在調用的時候執行查詢語句並生成結果,創建視圖的語法是create view …,查詢方法和表一樣
        2.另一個是InnoDB在實現mvcc時用到的一致性視圖,即consistent read view,用於支持RC(Read Committed,讀提交)和 RR(Repetable Read,可重複讀)隔離級別的實現。
        3.事務是如何實現的MVCC
        (1)每個事務都有一個事務ID,叫做transaction id(嚴格遞增)
        (2)事務在啓動時,找到已提交的最大事務ID記爲up_limit_id。
        (3)事務在更新一條語句時,比如id=1改爲了id=2.會把id=1和該行之前的row trx_id寫到undo log裏,並且在數據頁上把id的值改爲2,並且把修改這條語句的transaction id記在該行行頭
        (4)再定一個規矩,一個事務要查看一條數據時,必須先用該事務的up_limit_id與該行的transaction id做比對,如果up_limit_id>=transaction id,那麼可以看.如果up_limit_id<transaction id,則只能去undo log裏去取。去undo log查找數據的時候,也需要做比對,必須up_limit_id>transaction id,才返回數據

“快照”在MVCC裏怎樣工作

        在可重複讀隔離級別下,事務在啓動的時候“拍了個快照”,基於整庫的。
在這裏插入圖片描述
        對於當前事務啓動瞬間來說,一個數據版本的row trx_id有幾種情況
        1.綠色,表示這版本是已提交事務或當前事務生成的,數據可見
        2.落在紅色,表示這個版本由將來啓動的事務生成的,不可見
        如果落在黃色部分,那就包括兩種情況
                a.若 row trx_id 在數組中,表示這個版本是由還沒提交的事務生成的不可見;
                b.若 row trx_id 不在數組中,表示這個版本是已經提交了的事務生成的,可見。

        InnoDB利用了“所有數據都有多個版本”的這個特性,實現了“秒級創建快照”的能力。
        對於可重複讀,查詢只承認在事務啓動前就已經提交完成的數據
        對於讀提交,查詢只承認在語句啓動前就已經提交完成的數據
        當前讀,查詢只承認在語句啓動前就已經提交完成的數據

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