SQL標準定義的隔離級別

2022-06-22 18:42:11 字數 1189 閱讀 3454

一、未提交讀(read uncommited)

此事務中,a事務還未提交的修改可被b事務讀取到,稱為髒讀(dirty read),與髒資料不同;一般很少使用此隔離級別(效能並未有顯著優勢,且問題較多)

二、提交讀(不可重複讀)(read commited)

大部分資料庫的預設隔離級別,b事務只能讀取a事務中已提交的資料。例如:

1、a事務開啟,讀取表a記錄1

2、b事務開啟,並修改表a記錄1,提交

3、a事務重新查詢表a記錄1,已經是事務b中修改後的結果

一般指兩次查詢會有不同結果,所以也稱為不可重複讀(一般針對update場景)

解決問題:髒讀

三、可重複讀(repeatable read)

mysql的預設隔離級別,a事務只能讀取到在a事務開啟之前,其他事務已提交的資料。例如:

1、a事務開啟,讀取表a記錄1

2、b事務開啟,對錶a記錄1進行修改並提交

3、a事務重新讀取表a記錄1,仍然是一樣的資料,並未讀取到b事務中的修改

解決問題:不可重複讀

ps:幻讀-一般指在插入新資料的場景下(針對insert場景):

1、a事務開啟,讀取表1,id大於3的記錄,此時有2條

2、b事務開啟,插入1條id為11的記錄到表1,並提交

3、a事務重新讀取表1,id大於3的記錄,此時有3條。

mvvc:只在提交讀和不可重複讀隔離級別中使用,通常用悲觀鎖和樂觀鎖實現【基於併發場景】

* 悲觀鎖,一般對共享資源上鎖,容易造成死鎖和較長的等待時間

* 樂觀鎖,通常引入版本號概念,通過比對版本號來確定操作是否能夠成功。並不上鎖,一般情況下多條併發處理,只會有一條成功。

四、可序列化(serializable)

最高的隔離級別。會強制事務序列執行,簡單來說,會在讀取(讀鎖)的每一行資料上都加鎖,一般來說在多執行緒場景下,效能低下。

解決問題:幻讀

隔離級別

髒讀不可重複讀

幻讀未提交讀√√

√提交讀χ√

√可重複讀χχ

√可序列化χχ

χmysql預設的隔離級別是可重複讀,一般我們也是選擇這個隔離級別

原因:如上**,可重複讀解決了髒讀和可重複讀的問題,而一般又採用了mvvc多版本併發控制來解決幻讀的問題,所以在效率和acid綜合考慮下是相對較好的乙個隔離級別選擇

oracle預設是不可重複讀

SQL標準定義的資料狀態

ansi sql標準定義的資料狀態 dirty read 髒讀 讀到為提交的資料,這個資料可能回滾 unrepeatable read 不可重複讀 讀同一行資料讀兩次,有可能在讀第二次的時候資料已經被修改了。second lost update 第二次更新丟失 這是unrepeatable的一種特殊...

SQL標準定義的資料狀態

sql標準定義的資料狀態 ansi sql標準定義的資料狀態 dirty read 髒讀 讀到為提交的資料,這個資料可能回滾 unrepeatable read 不可重複讀 讀同一行資料讀兩次,有可能 在讀第二次的時候資料已經被修改了。www.2cto.com second lost update ...

IT專案角色標準定義

專案主管 負責協助專案經理分配資源,確定優先順序,協調公司和專案組之間的溝通。保證專案團隊一直處於良好的狀態中。同時監督專案經理的工作方法,以確保專案以及工件符合公司的發展方向以及使用者實際需要。專案經理 專案經理負責分配資源,確定優先順序,協調與客戶和使用者之間的溝通。盡量使專案團隊一直集中於正確...