国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

mysql實物隔離級別

Original 2016-11-04 13:00:06 1327
abstract:mysql實現(xiàn)了四種隔離級別Read Uncommitted(未提交讀)       在該隔離級別,所有事務都可以看到其他未提交事務的執(zhí)行結果。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。 Read Committed(不可重復讀)  

mysql實現(xiàn)了四種隔離級別

Read Uncommitted(未提交讀)

       在該隔離級別,所有事務都可以看到其他未提交事務的執(zhí)行結果。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。

 

Read Committed(不可重復讀)

       這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經(jīng)提交事務所做的改變。這種隔離級別 也支持所謂的不可重復讀(Nonrepeatable Read),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果。(一個事物多次讀取的結果可能不一樣)。也叫提交讀。

 

Repeatable Read(可重復讀)

       這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行(mysql用快照解決該問題)。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)有新的“幻影” 行(mysql用間隙鎖解決該問題)。InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。(一個事物多次讀取的結果一樣)。

 

Serializable(可串行化) 
       這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導致大量的超時現(xiàn)象和鎖競爭。

-------------------------------------------------------------------------------------------------------------------------------------------------

Repeatable Read隔離級別衍生問題總結

幻讀:一個事務在操作過程中!有別的事務對此數(shù)據(jù)集進行了修改并提交,但這些操作第一個事務讀不到,等到這個事務提交的時候,便有可能引起明明插入的數(shù)據(jù)沒有查詢到,但卻出現(xiàn)插入重復的錯誤!

不可重復讀與幻讀的區(qū)別:

不可重復讀是能讀到其它事務已經(jīng)提交的數(shù)據(jù),幻讀是讀不到其它事務已提交的數(shù)據(jù)!

間隙鎖:間隙鎖主要用來防止幻讀,用在repeatable-read隔離級別下,指的是當對數(shù)據(jù)進行條件,范圍檢索時,對其范圍內也許并存在的值進行加鎖!

---------------------------------------

比如where id <8 lock in share mode,則對8以下的值都加間隙鎖,

select max(id) ........lock in share mode,則會對max(id)以上的并不存在值加間隙鎖!  

select * from e where id=20 lock in share mode 則只會對id=20加鎖!(此時可能只是普通的共享鎖了)

select * from e lock in share mode; 則對整個e加上間隙表鎖!

 

幻讀案例:有個表(id字段為唯一約束)每次插入前需查詢這字段的最大值,然后再取最大值+1插入!

事務1:                                                                            事務2:

select max(id) from e;                                                      insert into e values (11)

10                                                                                   commit;

insert into e values (11)

commit;

ERROR 1062 (23000): Duplicate entry ‘11‘ for key ‘id‘

在上述事務1中明明查詢最大值為10,但插入最大值+1的時候卻報錯!

 

解決方案:利用mysql間隙鎖

事務1:                                                                           事務2:

select max(id) from e lock in share mode;  

(此時會對id為10以上的所有不存在的值加間隙鎖)                   

10                                                                                  insert into e values (11);

insert into e values (11)                                                   commit;  此時提交會一處于等待狀態(tài),

commit;

---------------------------------------

幻讀問題解決,但是上面的例子中,會導致上面的插入語句等待。


Release Notes

Popular Entries