有一天同事問我,晨哥晨哥,什麼是資料庫的隔離級別,我,額,稍等,冒汗,以前看過,現在忘了。
有時間寫一篇,下次再忘了還能看看。主要是自己看,順便滿足一下自己寫作的慾望,如果你不小心看到了,證明咱倆有緣分,別因為我寫的不好噴我。
你以為第一件事是介紹資料庫隔離級別的定義嗎,
錯,我們要先了解為什麼有資料庫的隔離級別。
我們了解一件新知識的時候先要明白它是解決什麼問題的,資料庫隔離級別解決的是事務併發的問題。
那麼問題就來了,什麼是事務。
資料庫事務的概念比較簡單,不考試的情況下用口語表達就是幾個事件要麼一起生效,要麼一起失效。
當然這個事件是資料庫的事件,生活中的事兒不要硬往上套。?,笑臉,手動滑稽。
不鬧了,說正經的。正經臉。
事務併發會出現什麼問題,這還不簡單,兩個覆蓋問題,三個查詢問題。
這就有意思了,什麼叫兩個覆蓋,三個查詢。
咱們以最經典的銀行卡餘額為例。 假設有一張表,裡面就乙個字段 money , 咱來看一下併發事務的問題。
money
1000
時間點事務a
事務bt1
開啟事務
開啟事務
t2讀到 1000
讀到 1000
t3給賬號 + 500
t4賬號餘額 1500
t5提交事務
t6給賬號 -500
t7賬號餘額 500
t8回滾事務
t9賬號變 1000
最後丟失了事務 b 提交的記錄。
時間點事務a
事務bt1
開啟事務
開啟事務
t2讀到 1000
讀到 1000
t3給賬號 + 500
t4賬號餘額 1500
t5提交事務
t6給賬號 -500
t7賬號餘額 500
t8提交事務
t9賬號變 500
這是因為提交覆蓋了 b 提交的事務。
時間點事務a
事務bt1
開啟事務
開啟事務
t2讀到 1000
t3給賬號 + 500
t4賬號餘額 1500
t5查詢到賬戶餘額 1500(髒讀)
t6再給賬戶 +100
回滾事務
t7賬號餘額 1600
t8提交事務
t9賬號變 1600
因此,讀到未提交的資料,也叫髒讀。
時間點事務a
事務bt1
開啟事務
開啟事務
t2讀到 1000
讀到 1000
t3給賬號 + 500
t4賬號餘額 1500
t5提交事務
t6又讀一次,變 1500 了
t7讀兩次效果不一樣
這種讀兩次效果不一樣的,也叫不可重複讀。
時間點事務a
事務bt1
開啟事務
開啟事務
t2sum() 一下值是 1000
t3插入一條新的 1000 的記錄
t4提交事務
t5再 sum() 一下值變成 2000 了
這種奇幻的效果就叫做幻讀。
既然事務併發會有這麼多的問題,那我們設計系統的時候總得有所取捨,到底哪些現象是和合理的,哪些現象是不合理的要避免的。
資料庫設計也是一樣,這些問題有些是不合理一定要避免的,有些呢,在業務場景中是合理的,不能一棍子打死。
那到底哪些場景下是合理的哪些是不合理的,資料庫把它設計成了乙個可選項,就叫資料庫隔離級別,供開發人員選擇。
所有事務操作都是序列的,乙個事務執行完才執行下一下,這樣肯定不會用問題,當然效率也是最慢。
就是讀不到別的事務的對記錄的更新【包括已提交和未提交】,能讀到已經提交的插入。innodb 儲存引擎通過多版本併發控制,mvcc 解決了幻讀的問題。
就是能讀到別的事務對記錄的更新,也能讀到已插入的記錄
可以看到其他事務未提交的更新,插入也能看到。
資料庫鎖和資料庫隔離級別
最近突然發現忘了資料庫鎖和資料庫隔離級別,時常弄混它們之間的關係。為此特此寫下此部落格,以方便自己複習,同時也可以幫助博友。資料庫鎖 資料庫鎖就是事務t在對某個資料物件 例如表 記錄等 操作之前,先向系統發出請求,對其加鎖。加鎖後事務t就對該資料物件有了一定的控制,在事務t釋放它的鎖之前,其它的事務...
資料庫鎖和資料庫隔離級別
最近突然發現忘了資料庫鎖和資料庫隔離級別,時常弄混它們之間的關係。為此特此寫下此部落格,以方便自己複習,同時也可以幫助博友。資料庫鎖 資料庫鎖就是事務t在對某個資料物件 例如表 記錄等 操作之前,先向系統發出請求,對其加鎖。加鎖後事務t就對該資料物件有了一定的控制,在事務t釋放它的鎖之前,其它的事務...
資料庫事務隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...