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