通俗易懂 徹底搞清Mysql事務的四種隔離級別

2021-09-02 08:04:28 字數 2385 閱讀 1410

上網找資料學習,過多的專業術語讓人看得頭大難以專注持久閱讀,本人想總結一篇部落格讓自己永遠記住這些概念,廢話不多說,通俗易懂**並茂來徹底理解四種事務隔離級別

讀未提交(read-uncommitted)

不可重複讀(read-committed)

可重複讀(repeatable-read)

序列化(serializable)

髒讀

不可重複讀

幻讀

看不懂?沒關係,反正第一次看名詞解釋也沒幾個能理解的,我就連基本解釋也省了直接看下面。

sql :

set session transaction isolation level read uncommitted;

start transaction;

看圖,劇本是這樣的

時間線t1:事務2——>查詢餘額是 1000 元,買了900元東西

時間線t2:事務1——>在使用者2扣款,但還未提交,使用者1查詢餘額只有100

使用者1本來想買200元的東西,查詢餘額只有100只好作罷

劇本結局:事務2在事務1查詢之後意外回滾了,金額變回了1000元,這次事故導致使用者1本來可以買(或有機會可以買)到東西的,結果變成了餘額不足

——————————————————————隔離線————————————————————

時間原因,故事不好找(很難找到不可重複讀帶來影響的例子),快速翻譯幾個名詞,借助上面的故事各位自行理解下

不可重複讀(read-committed):這個隔離級別應該翻譯為 :可以讀到自身事務內和非自身事務內已經修改提交的資料

例子:

時間1. 事務1讀取到1000元

時間2:事務2扣了100元未提交

時間3:事務1讀取到1000元

時間4:事務2提交,事務1讀取到900元

所以叫可讀已提交的資料。為什麼叫不可重複讀,大概是這個隔離級別有可能導致兩次讀取資料不一致

可重複讀(repeatable-read):可以讀到自身事務內已經修改提交的資料

例子:

時間1:事務1讀取到1000元

時間2:事務2扣了100元提交了

時間3:事務1讀取到1000元

時間4:事務2提交,事務1讀取到1000元

序列化(serializable):事務與事務之間排隊執行,比如都對錶1操作的兩個事務,事務1和事務2,事務1執行時直接鎖表,事務1執行完後,才會執行事務2——效率最低非常少使用

讀未提交(read-uncommitted)——>不可重複讀(read-committed)——>可重複讀(repeatable-read)

——>序列化(serializable)

髒讀——>不可重複讀——>幻讀

讀未提交(read-uncommitted)造成的毛病:髒讀——>不可重複讀——>幻讀

不可重複讀(read-committed)造成的毛病:不可重複讀——>幻讀     解決的毛病:髒讀

可重複讀(repeatable-read)造成的毛病:(mysql中) 無   解決的毛病:所有

序列化(serializable):造成的毛病:無    解決的毛病:所有

通俗易懂的MySQL事務隔離

事務 transaction 是由一系列對系統中資料進行訪問與更新的操作所組成的乙個程式執行邏輯單元。僅從其定義來看,你可能難以理解什麼是事物,接下來我們舉個經典例子來說明事務的用途 使用者a向使用者b轉賬,我們需要進行以下操作 從a賬戶中把餘額讀出來 對a賬戶做減法操作 把結果寫回a賬戶中 從b賬...

numpy bincount 通俗易懂

bincount的用途很簡單,就是統計出乙個列表的各個元素的出現次數。例如輸入是 1,0,2,2,1,2,3,5 那麼輸出就是 1,2,3,1,0,1 這樣的結果可能並不是很直觀,可能依然會有同學會問為什麼會輸出這樣的結果。我們看看 假如我們把輸入的列表中的數字都統計一遍,形成乙個字典 key是列表...

通俗易懂的C STL

泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。泛型程式設計在c 上的應用主要體現在兩方面 函式模板和類模板。接下來舉個栗子 csdn部落格 anyway,模板...