mysql mvcc知識點總結

2021-10-07 05:07:06 字數 4194 閱讀 8218

atomicity 原子性: 指整個操作要麼都成功,要麼都失敗,不能有些操作成功有些操作失敗。

consistency 一致性: 指事務的執行結果必須使資料庫從乙個一致性到另乙個一致性狀態。什麼是不一致性狀態?就是當乙個事務因某種原因中斷時,這個事務對資料庫的一些操作被寫入到了資料庫,這是資料庫就是一種不一致性狀況。

isolation 隔離性: 多個同時併發執行的事務不會互相影響,它們最後對資料庫造成的結果和它們序列執行結果是一樣的。

durability 永續性:事務提交後,對於資料庫的資料的影響是持久的,不會在因為其他故障而造成資料丟失或改變。

丟失更新

多個事務都對同乙個資料進行修改,後面修改的會覆蓋前面修改掉的,彷彿前面的修改就不存在一樣。主要有回滾丟失和覆蓋丟失兩種,一般回滾丟失都不被允許出現。

髒讀

事務a讀取了事務b尚未提交的更改資料,並在這個讀取的資料上繼續進行操作。如果這時候事務b進行了回滾,事務a讀取的資料就不被承認。

不可重複讀

事務a和事務b都讀取了同乙個資料,事務b對這個資料進行了修改並提交,這時事務a重新在讀取一次這個資料,和上一次讀取結果不一樣。

幻讀

事務a在兩次讀取資料間,發生了事務b提交了新增資料,那麼事務a的兩次讀取結果不一致,大多發生在資料統計中。

讀未提交(read uncommitted)

事務a 能夠讀取到事務b未提交卻修改了的資料。存在髒讀、不可重複讀、幻讀問題。

讀已提交(read committed)-oracle預設的級別

事務只能讀取提交了的資料。解決了髒讀問題,還存在不可重複讀和幻讀問題。

可重複讀(repeatable read)-mysql預設的級別

事務a讀取了乙個資料,事務b也讀取了同乙個資料並進行修改提交,事務在進行讀取這個資料,還會是原來那個資料。

序列化(serializable)

解決了髒讀、可重複讀和幻讀的問題。

隔離級別越高,資料越安全,效能越差。

shared lock共享鎖》 允許事務去讀取資料,不允許其他事務獲得該資料的排他鎖。行鎖

exclusive lock排他鎖》 允許持有的事務對該資料進行修改,禁止其他事務獲得該資料的共享鎖和排他鎖。行鎖

is lock意向共享鎖》 在給資料行加共享鎖前,要先獲得意向共享鎖。表鎖

ie lock意向排他鎖》 在給資料行加排他鎖前,要先獲得意向排他鎖。表鎖

record locks行鎖》 鎖索引

gap lock間隙鎖》 開區間鎖 要rr級別 不互斥

next-key lock臨鍵鎖》 左開右閉鎖 在發生在rr級別下,innodb對於行的查詢都是採用了next-key

lock,還會對輔助索引下乙個鍵值加上gap lock。當查詢的索引含有唯一屬性的時候,next-key lock 會進行優化,將其降級為record lock,即僅鎖住索引本身,不是範圍。

insert intention lock插入意向鎖》 用於併發插入。

auto-inc lock自增鎖》 用於事務插入自增字段。

悲觀鎖機制

新增共享鎖方式 select x from xx lock in share mode;

新增排他鎖方式 select x from xx for update;

樂觀鎖機制

在表中新增timestamp欄位,只有在插入或修改時才會更新字段。

進行修改時,會進行查詢timestamp,判斷此次查詢是否為舊版本。

redo logredo log是innodb引擎實現的,是一種大小固定的物理日誌,用迴圈順序的方式記錄資料修改變化。mysql先在記憶體中儲存資料,在事務提交後才修改磁碟資料。在資料庫發生異常停止時,可以通過redo log 將已提交的未同步到磁碟的事務資料存到磁碟中,保證事務資料不會丟失,讓acd(原子性、一致性、永續性)原則得到保證。

bin log

binlog是一種邏輯日誌,在server層上實現的,和redo log有著相同的功能。但不像redo log有固定大小的空間,不會出現日誌覆蓋,而且能在所有引擎中使用,可以用於資料恢復、或主從架構的資料複製等。

undo logmulti-version concurrency control 多版本控制

mvcc只會在read committedrepeatable read兩個隔離級別中使用。

當前讀

讀取資料的最新版本,且會對資料進行加鎖。

快照讀

讀取的可能會是舊版本,基於mvcc來實現,能夠有效提高效能,避免加鎖。

在innodb中會在資料庫的每一行資料後面新增3個字段。

db_row_id(6bytes)

當表中沒有主鍵且沒有非null的唯一鍵時,innodb會自己建立聚集索引,而這個索引值就是db_row_id。

db_trx_id(6bytes)

記錄操作這條記錄的最新事務id。

db_roll_ptr(7bytes)

可以理解為指向undo log segment的undo log,是乙個回滾指標。

readviewreadview是在事務開啟時,記錄當前還存活的事務的乙個集合。

在readview中記錄有集合中事務id最大,這裡稱為max,以及同理的min,還有建立這個readview的事務creattrxaid,當每個事務建立時,其事務id是呈遞增的。

rc級別下readview會在每一次語句的執行後,重新進行構建乙個新的,所以存在不可重複讀。

rr級別下readview在事務建立的過程中被建立出來,一直存活到事務結束。

mvcc的比較方式

->當對一條資料進行操作時,根據trx_id與readview集合中max進行比較,如果trex_id大於max,說明這條資料是在當前事務生產readview後產生的,不能被訪問。

->將trx_id與readview集合中min進行比較,如果trex_id小於min,說明這條資料是在當前事務生產readview前產生的,可以被訪問。

->如果trx_id在min和max之間,就進行判斷是否存在於readview,如果存在,說明其對應的事務操作還沒結束,不應該被訪問。

->如果trx_id和creattrxaid一致,說明這條資料是自己操作,可以直接訪問,

->當上述條件都不滿足時,當前事務就會根據roll_ptr來查詢符合自己條件的版本資料。

roll_ptr會指向undolog中的更早版本的資訊

知識點總結

1,迴圈中的中斷 continue 跳出此次迴圈,繼續for迴圈 break 跳出當前for迴圈 return 跳出當前方法 2,字串的操作 componentseparatedbystring stringbyreplacingoccurencesofstring withstring iskin...

知識點總結

oncreate onstrat onresume onpause onstop onrestart ondestroy standard 啟動activity都會產生乙個新的activity 預設模式 singletop 啟動activity允許多個,但不允許重疊 singletask 只允許有乙...

知識點總結

function go go 呼叫 go為變數名 setinterval go,1000 1000ms clearinterval 關閉定時器 function abc a,b 2,3 5undefined 未定義 null 空 nan 非數值 string 字串 var a 123 數字型別 va...