關於資料庫的隔離性的面試問題

2021-09-24 22:18:55 字數 2477 閱讀 2446

一、首先事務的四大特性:

a(原子性,要麼全部提交,要不不提交)

c(一致性,一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須處於一致性狀態。

拿轉賬來說,假設使用者a和使用者b兩者的錢加起來一共是5000,那麼不管a和b之間如何轉賬,轉幾次賬,事務結束後兩個使用者的錢相加起來應該還得是5000,這就是事務的一致性。)

i(隔離性,處理併發問題)(這裡說一句多執行緒和併發的關係,就像是方法與目的的關係一樣)

d(永續性,永續性是指乙個事務一旦被提交了,那麼對資料庫中的資料的改變就是永久性的,即便是在資料庫系統遇到故障的情況下也不會丟失提交事務的操作。)

二、如果不考慮事務的隔離性會產生的併發問題:

1、髒讀:b事務讀取到了a事務尚未提交的資料

2、不可重複讀:乙個事務中兩次讀取的資料的內容不一致

3、幻讀/虛讀:乙個事務中兩次讀取的資料的數量不一致

三、資料庫隔離級別

1、read uncommitted : 讀未提交 :哪個問題都不能解決

2、read committed:讀已提交 :可以解決髒讀 —- oracle預設的

3、repeatable read:可重複讀:可以解決髒讀和不可重複讀 —mysql預設的

4、serializable:序列化:可以解決髒讀不可重複讀和虛讀—相當於鎖表

三、資料庫的隔離級別實現原理

1、read uncommitted : 讀未提交:

事務對當前被讀取的資料不加鎖;

事務在更新某資料的瞬間,必須先對其加行級共享鎖,直到事務結束才釋放。

表現:① 事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新(因為事務一並未對資料增加任何鎖)

② 當事務2對該記錄進行更新時,事務1再次讀取該記錄,能讀到事務2對該記錄的修改版本(因為事務二只增加了共享讀鎖,事務一可以再增加共享讀鎖讀取資料),即使該修改尚未被提交。

③ 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。(因為事務一對資料增加了共享讀鎖,事務二不能增加排他寫鎖進行資料的修改)

2、read committed:讀已提交

事務對當前被讀取的資料加 行級共享鎖(當讀到時才加鎖),一旦讀完該行,立即釋放該行級共享鎖;

事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加行級排他鎖,直到事務結束才釋放。

表現:① 事務1在讀取某行記錄的整個過程中,事務2都可以對該行記錄進行讀取(因為事務一對該行記錄增加行級共享鎖的情況下,事務二同樣可以對該資料增加共享鎖來讀資料。)。

② 事務1讀取某行的一瞬間,事務2不能修改該行資料,但是,只要事務1讀取完改行資料,事務2就可以對該行資料進行修改。(事務一在讀取的一瞬間會對資料增加共享鎖,任何其他事務都不能對該行資料增加排他鎖。但是事務一只要讀完該行資料,就會釋放行級共享鎖,一旦鎖釋放,事務二就可以對資料增加排他鎖並修改資料)

③ 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。(事務一在更新資料的時候,會對該行資料增加排他鎖,知道事務結束才會釋放鎖,所以,在事務二沒有提交之前,事務一都能不對資料增加共享鎖進行資料的讀取。所以,提交讀可以解決髒讀的現象)

在提交讀隔離級別中,在事務二提交之前,事務一不能讀取資料。只有在事務二提交之後,事務一才能讀資料。

但是從上面的例子中我們也看到,事務一兩次讀取的結果並不一致,所以提交讀不能解決不可重複讀的讀現象。

簡而言之,提交讀這種隔離級別保證了讀到的任何資料都是提交的資料,避免了髒讀(dirty reads)。但是不保證事務重新讀的時候能讀到相同的資料,因為在每次資料讀完之後其他事務可以修改剛才讀到的資料。

3、repeatable read:可重複讀

事務在讀取某資料的瞬間(就是開始讀取的瞬間),必須先對其加 行級共享鎖,直到事務結束才釋放;

事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加 行級排他鎖,直到事務結束才釋放。

表現:① 事務1在讀取某行記錄的整個過程中,事務2都可以對該行記錄進行讀取(因為事務一對該行記錄增加行級共享鎖的情況下,事務二同樣可以對該資料增加共享鎖來讀資料)

② 事務1在讀取某行記錄的整個過程中,事務2都不能修改該行資料(事務一在讀取的整個過程會對資料增加共享鎖,直到事務提交才會釋放鎖,所以整個過程中,任何其他事務都不能對該行資料增加排他鎖。所以,可重複讀能夠解決不可重複讀的讀現象)

③ 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束。(事務一在更新資料的時候,會對該行資料增加排他鎖,知道事務結束才會釋放鎖,所以,在事務二沒有提交之前,事務一都能不對資料增加共享鎖進行資料的讀取。所以,提交讀可以解決髒讀的現象)

在上面的例子中,只有在事務一提交之後,事務二才能更改該行資料。所以,只要在事務一從開始到結束的這段時間內,無論他讀取該行資料多少次,結果都是一樣的。

從上面的例子中我們可以得到結論:可重複讀隔離級別可以解決不可重複讀的讀現象。但是可重複讀這種隔離級別中,還有另外一種讀現象他解決不了,那就是幻讀。看下面的例子:

資料庫面試問題

1 等值查詢,雜湊索引具有絕對優勢 前提是 沒有大量重複鍵值,如果大量重複鍵值時,雜湊索引的效率很低,因為存在所謂的雜湊碰撞問題 在heap表中,如果儲存的資料重複度很低 也就是說基數很大 對該列資料以等值查詢為主,沒有範圍查詢 沒有排序的時候,特別適合採用雜湊索引。何為堆表 2 b樹和b 樹掃盲?...

資料庫隔離性

事務的特性 原子性 一致性 隔離性 永續性 多事務同時執行的時候,可能會出現的問題 髒讀 不可重複讀 幻讀 事務隔離級別 讀未提交 讀提交 可重複讀 序列化 不同事務隔離級別的區別 讀未提交 乙個事務還未提交,它所做的變更就可以被別的事務看到 讀提交 乙個事務提交之後,它所做的變更才可以被別的事務看...

2014 7 27 資料庫的隔離性

演示不同隔離級別下的併發問題 1.當把事務的隔離級別設定為read uncommitted 會引發髒讀,不可重複讀,虛讀 a視窗set transaction isolation level read uncommitted start transaction select from account...