資料庫事務 和 資料庫隔離級別

2021-10-01 10:30:47 字數 2015 閱讀 2490

有一天同事問我,晨哥晨哥,什麼是資料庫的隔離級別,我,額,稍等,冒汗,以前看過,現在忘了。

有時間寫一篇,下次再忘了還能看看。主要是自己看,順便滿足一下自己寫作的慾望,如果你不小心看到了,證明咱倆有緣分,別因為我寫的不好噴我。

你以為第一件事是介紹資料庫隔離級別的定義嗎,

錯,我們要先了解為什麼有資料庫的隔離級別。

我們了解一件新知識的時候先要明白它是解決什麼問題的,資料庫隔離級別解決的是事務併發的問題。

那麼問題就來了,什麼是事務。

資料庫事務的概念比較簡單,不考試的情況下用口語表達就是幾個事件要麼一起生效,要麼一起失效

當然這個事件是資料庫的事件,生活中的事兒不要硬往上套。?,笑臉,手動滑稽。

不鬧了,說正經的。正經臉。

事務併發會出現什麼問題,這還不簡單,兩個覆蓋問題,三個查詢問題

這就有意思了,什麼叫兩個覆蓋,三個查詢。

咱們以最經典的銀行卡餘額為例。 假設有一張表,裡面就乙個字段 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...