網上大多數關於隔離級別的文章都是講了事務中的問題以及隔離級別可以解決的問題,我這次想看看資料庫底層是如何實現隔離級別的。
不過還是先來回顧一下隔離級別以及可能發生的問題。
1.髒讀:指的是乙個事務的讀操作讀到了另乙個未提交的事務修改的值。比如下面的場景:
髒讀的問題是,讀到的值可能會被回滾,那麼這個值就是失效的,不能繼續使用,否則會有一致性問題。
2.不可重複讀:指的是乙個事務讀了同乙個值兩次,但是兩次的值不同,因為中間另乙個事務修改了這個值,比如下面的場景:
t2事務是已提交的,所以t1的第二次讀取是可以讀到的。
3.幻讀:仍然指的是乙個事務中讀了兩次,結果不同,但是與不可重複讀不同的是,這裡不同是因為別的事物做了插入操作,而且讀的條件是乙個範圍的條件,這樣第二次會多讀到一條資料,比如下面的例子:
相應的有四種隔離級別,不同程度的解決了上面的問題:
可以看到隔離界別越高,解決的問題就越多,但是並行化程度也越低,效率也越低。
那麼資料庫是如何實現隔離界別呢?下面以mysql innodb引擎來說下。事務隔離性,本質上解決事務的讀寫衝突的,在mysql中,讀操作被實現為一種叫做「非鎖定讀取「的技術。什麼意思,我們通常會說資料庫裡有共享鎖和排它鎖,讀操作就是共享鎖,只有共享鎖和共享鎖是非互斥的,那麼如果乙個讀操作要在乙個正在被修改的資料上進行,那麼是無法加上獲取該行物件的共享鎖的,這便是資料庫序列化隔離界別的實現方式,但是在其餘的隔離界別下,我們不需要這麼嚴格的隔離,我們允許了讀操作可以在正在被修改的資料上即加上了排它鎖的行資料上進行,這就是所謂的」非鎖定讀取「概念。
那麼,讀取的結果是什麼?這個還需要明白另一點,就是我們資料庫mvcc和undo日誌,我們每一次的修改操作,並不是直接對行資料進行操作,比如我們設定id為3的行的a屬性為10,並不是直接修改表中的資料,而是新加一行,同時資料表其實還有一些隱藏的屬性,比如每一行的事務id,所以每一行資料可能會有多個版本,每乙個修改過它的事務都會有一行,並且還會有關聯的undo日誌,表示這個操作原來的資料是什麼,可以用它做回滾。那麼為什麼要這麼做?因為如果我們直接把資料修改了,那麼其他事務就用不了原先的值了,違反了事務的一致性。那麼乙個事務讀取某一行的資料到底返回什麼結果呢?取決於隔離級別,如果是read committed,那麼返回的是最新的事務的提交值,所以未提交的事務修改的值是不會讀到的,這就是read committed實現的原理。如果是read repeatable級別,那麼只能返回發起時間比當前事務早的事務的提交值和比當前事務晚的刪除事務刪除的值。這其實就是mvcc方式。所以在第二個例子中,t2事務發生在t1後面,所以它更新的值是不會被t1讀取到的,所以t1兩次讀取的值相同,也就是可以重複讀。
關於可序列化的隔離界別,也很簡單,嚴格的按照加鎖協議來就可以,該級別可以避免上述所有的問題。
在oracle等資料庫中,為了避免幻讀,只能採用可序列化隔離級別,但是在innodb引擎中,在repeatable read級別也可以實現,主要是一種叫做」next locking「的技術,一種特殊的鎖。
正常的鎖一般是鎖一行,稱為是record鎖,而」next lock「則是鎖乙個範圍內的行,比如說第三個例子中,t1事務第一次查詢的是10到30之間的資料,那麼最終這些資料都要被上鎖,那麼後面t2事務想要插入資料就不行了,會被拒絕,再往後,t1的第二次讀取就會和第一次一樣了。innodb採用這樣的辦法,就在repeatable read級別解決了幻讀的問題。
最後總結一下innodb裡面的鎖的互斥,在可序列化級別,嚴格按照加鎖協議,只有共享鎖可以並行,其他全部阻塞。但是在其他的隔離級別,就放寬了很多。不過寫-寫是肯定不行的,讀-讀是肯定行的,讀-寫也是可以的,只不過讀到什麼內容就由mvcc來決定,由具體的隔離級別決定,寫-讀一般都可以,只有在啟用了」next locking「的情況下會被拒絕。
mysql資料庫隔離級別
事務的隔離級別 由高到低 1.序列化 serializable 乙個事務乙個事務的執行 2.可重複讀 repeatable read 可重複讀,無論其他事務是否修改並提交了資料,在這個事務中看到的資料值始終不受其他事務影響 mysql資料庫所預設的級別 3.讀已提交 read committed 讀...
資料庫事務及隔離級別
1資料庫四大特性 資料庫具有事務安全性,同時也具有acid四大特性 原子性 一致性 隔離性 永續性 原子性 atomicity 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能...
資料庫事務及隔離級別
1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程 錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consistency 事務開始前和...