數據庫的四種隔離級別

一、read uncommitted:讀未提交

SQL1:select * from test where id = 1
SQL2:update test set name='newname' where id = 1

原理數據庫

操做一在進行數據庫讀操做時,不對數據庫上任何鎖;spa

操做二在進行更新操做時,對數據加行級共享鎖。code

現象:blog

事務1 事務2
select * from test where id = 1

 

 
update test set name='newname' where id = 1
select * from test where id = 1
 
 
rollback

事務一共查詢了兩次,兩次查詢結果不同。在兩次查詢的過程當中,事務二對數據進行了修改,並未提交(commit)。可是事務一的第二次查詢查到了事務二的修改結果。在數據庫的讀現象淺析中咱們介紹過,這種現象咱們稱之爲髒讀事務

二、read committed(讀已提交)

原理get

SQL1在讀數據時加行級共享鎖,讀完該行當即釋放;it

SQL2在更新數據時加行級排他鎖。只有在更新操做提交之後才容許其餘操做,事務完成後釋放table

現象class

SQL1進行兩次讀操做,在第一次讀操做後,SQL2開始執行並對該數據加排他鎖,SQL1只能等到SQL2執行完畢後執行第二次讀操做。讀已提交會致使兩次讀取的結果不一致,也就是不可重複讀現象。test

三、repeatable read(可重複讀)

事務1:select  * from test where age  between 10 and 21;

事務2:insert into test values(1,'newname',20);

原理

SQL1進行讀操做時,對操做數據加行級共享鎖,直到事務結束才釋放;

更新操做添加行級排他鎖,更新後釋放。

現象

只有事務一結束,事務2才能夠執行,因此能夠解決不可重複讀的問題;

如果SQL2是插入語句,因爲事務1對數據加的是行級共享鎖,沒有對整表加鎖,因此SQL2能夠執行。這樣兩次SQL1的結果不一致,致使幻讀。

四、serializable(可序列化)

原理

讀寫都加表級排他鎖

相關文章
相關標籤/搜索