關於innodb的一些理解

2021-08-14 23:34:44 字數 1469 閱讀 7700

innodb一致性讀的理解:

如果此時的隔離級別為rr:

事務開啟時不會建立read view,而是在事務中出現第乙個select語句的時候建立read view這個資料結構,這個資料結構包含以下的幾個字段

1、up_limit_id:代表建立這個read view時當前全域性事務中已經提交的事務的最後乙個事務的id

2、low_limit_id:代表建立這個read view時全域性事務中已經建立的事務的最大的id

3、data_roll_ptr:記錄的是並不在意read view中,這個欄位在主鍵索引的資料節點中,記錄的是當前這條資料的undo日誌指標,代表了這條資料的之前的版本

4、tax_ids:是乙個指標指向乙個陣列,表示當前全域性事務中的活動的事務的id

如果此時的隔離級別為rc:

如果隔離級別為rc的話每次select都會重新生成乙個新的read view保證每次讀到的都是最新的檢視

innodb的查詢邏輯為:

當事務中出現第乙個select時,建立乙個read view資料結構

查詢到資料的時候會比較資料中的事務id,如果資料中的事務id小於read view中的up_limit_id,則代表read view建立的時候這條資料已經提交,如果此時

這條資料的delete_bit標誌位為0,則代表可讀,1則代表不可讀

如果資料的事務id比read view中的low_limit_id還大,則說明read view建立的時候這個資料的事務還沒建立,則一定不可讀,此時需要根據這條資料的undo日誌指標

查詢資料的之前版本,用這條資料的之前版本再用一樣的邏輯判斷一遍,決定之前版本資料的可讀性

如果用up_limit_id和low_limit_id不能明確的判斷資料是否可讀,則說明這條事務正在活動中,需要再活動事務id的陣列中查詢,找到了則說明不可讀。

另外說明:

主鍵索引發生修改的時候,如果修改的主鍵則將原資料的delete_bit位置為1,再插入一條新的資料,同時新增乙個undo日誌。如果修改的是非主鍵則直接修改b+樹的葉子節點。

非主鍵索引無論修改的是不是索引記錄都直接新插入一條資料。

innodb鎖的語法:

insert update delete alter語句會自動的給行或者表加鎖

select語句不會加任何鎖

顯示加鎖的方法

select。。。。。lock in share mode 共享鎖

select。。。。。for update 獨佔鎖

在加共享鎖或獨佔鎖之前會自動加全表的意向鎖

鎖的實現方式:

行鎖是通過給索引加鎖實現的:

如果用到了主鍵索引則直接給主鍵索引的b+樹的葉子加點加鎖

如果用到了非主鍵索引則先給非主鍵索引的葉子節點加鎖再給主鍵索引的葉子節點加鎖

如果沒有用到主鍵索引和非主鍵索引則對全表的所有行加鎖(加的是行鎖但是效果和表鎖一樣)

行鎖的分類:

行鎖:對某一行加鎖

間隙鎖:給乙個範圍加鎖

關於熵的一些理解

對於理工科學生來說,熵 並不是乙個陌生的名詞。在諸如 大學物理 熱力學 和 資訊理論 等課程中都會有所介紹。但同時 熵 又是乙個顯得有點神秘的概念,看不見也摸不著。我最早是在高中物理課中聽說的,大概是在介紹 熱力學第二定律 時提到的。熱力學第二定律的內容是 熱力學過程是不可逆的 孤立系統自發地朝著熱...

關於float的一些理解

float是否脫離文件流,乙個父元素不設定overflow的話,子元素float,就不會把父元素撐開,換句話說,他就不會有高度,但是做個demo 父元素overflow hidden 子元素前兩個float,第三個不float,結果是第三個沒有clear浮動的元素,跟float的元素出現在同乙個位置...

關於android layout的一些理解

1 wrap content view的尺寸根據它的內容確定 match parent view的尺寸盡量和它的parent view group一樣大 2 獲得view的位置 position getleft gettop getright getleft getwidth getwidth 3 ...