事務隔離級別

2021-09-11 13:52:10 字數 3144 閱讀 6921

1, 原子性(atomicity):事務執行前與事務執行後,資料庫的狀態應該是一致的。

2, 一致性(consistency):事務執行前與事務執行後,資料庫的狀態應該是一致的。

3, 隔離性(isolation):如果同時有多個事務在資料庫中執行,事務與事務之間應該互不影響。

4,永續性(durability) :事務一旦提交,對資料庫的影響是持久的,就算關閉伺服器,資料也是持久存在。

如果不使用事務,那麼在資料庫執行多條語句的時候,有可能中間會出現問題而導致只執行了部分語句,因此,我們在這多條語句前面加上begin transaction,最後加上end transaction,這就是很清楚的標明了,在這些語句執行前,系統是處於一致性狀態的,而在這些語句執行後,系統也是處於一致性狀態的,至於這個一致性狀態的定義,則是由使用者通過這些語句來表達的。那麼如果語句執行完成了,事務提交,這時候資料庫系統就認為又到了乙個一致性狀態,而如果出現問題,系統則將操作回滾,返回初始狀態,因為這也是乙個一致性狀態。而如果出現故障重啟等事件時,資料庫管理系統在重啟後就會分析日誌,將所有begin/end全都有的事務跳過或重做,而只有begin沒有end的事務則undo,從而保證資料庫在可用的時候都是一致性狀態。

乙個資料庫可能擁有多個訪問客戶端,這些客戶端併發訪問資料庫時,若沒有採取必要的隔離措施,存在以下問題,這些問題分為5類,包括:

三類資料讀問題:髒讀、不可重複讀、幻讀;

兩類資料更新問題:第一類丟失更新、第二類丟失更新。

1, 髒讀:乙個事務讀取到了另乙個事務中尚未提交的資料;

1.1, (針對未提交資料)如果乙個事務中對資料進行了更新,但事務還沒有提交,另乙個事務可以「看到」該事務沒有提交的更新結果,這樣造成的問題就是,如果第乙個事務回滾,那麼,第二個事務在此之前所「看到」的資料就是一筆髒資料。

2, 不可重複讀: 乙個事務中兩次讀取的資料內容不一致,要求的是乙個事務中多次讀取時,資料是一致的,這是事務 update 時引發的問題;

2.1, (針對其他提交前後,讀取資料本身的對比)不可重複讀取是指同乙個事務在整個事務過程中對同一筆資料進行讀取,每次讀取結果都不同。如果事務1在事務2的更新操作之前讀取一次資料,在事務2的更新操作之後再讀取同一筆資料一次,兩次結果是不同的,所以,read uncommitted也無法避免不可重複讀取的問題。

3, 幻讀: 乙個事務中兩次讀取的資料的數量不一致,要求在乙個事務多次中,多次讀取時,事務的數量是一致的,這是 insert 或 delete 時引發的問題。

3.1, (針對其他提交前後,讀取資料條數的對比) 幻讀是指同樣一筆查詢在整個事務過程中多次執行後,查詢所得的結果集是不一樣的。幻讀針對的是多筆記錄。在read uncommitted隔離級別下, 不管事務2的插入操作是否提交,事務1在插入操作之前和之後執行相同的查詢,取得的結果集是不同的,所以,read uncommitted同樣無法避免幻讀的問題。

3.2, 不可重複讀和幻讀的區別是:前者是指讀到了已經提交的事務的更改資料(修改或刪除),後者是指讀到了其他已經提交事務的新增資料。對於這兩種問題解決採用不同的辦法:

3.2.1, 防止讀到更改資料,只需對操作的資料新增行級鎖,防止操作中的資料發生變化;

3.2.2, 防止讀到新增資料,往往需要新增表級鎖,將整張表鎖定,防止新增資料(oracle採用多版本資料的方式實現)。

4, 第一類丟失更新:a事務撤銷時,把已經提交的b事務的更新資料覆蓋了

例如:這時候取款事務a撤銷事務,餘額恢復為1000,這就丟失了更新。

5, 第二類丟失更新:a事務提交時,覆蓋b事務已經提交的資料,造成b事務所做的操作丟失

1, 概述:

為了解決上述問題,資料庫通過鎖機制解決併發訪問的問題。

根據鎖定物件不同:分為行級鎖和表級鎖;

根據併發事務鎖定的關係上看:分為共享鎖定和獨佔鎖定,共享鎖定會防止獨佔鎖定,但允許其他的共享鎖定。而獨佔鎖定既防止共享鎖定也防止其他獨佔鎖定。

為了更改資料,資料庫必須在進行更改的行上施加行獨佔鎖定,insert、update、delete 和 select for update 語句都會隱式採用必要的行鎖定。

但是直接使用鎖機制管理是很複雜的,基於鎖機制,資料庫給使用者提供了不同的事務隔離級別,只要設定了事務隔離級別,資料庫就會分析事務中的sql語句然後自動選擇合適的鎖。

2,  不同的隔離級別對併發問題的解決情況如圖:

注意:事務的隔離級別和資料庫併發性是成反比的,隔離級別越高,併發性越低。

2.1, 讀未提交:read uncommitted

事務 a 和事務 b ,事務 a 未提交的資料,事務 b 可以讀取到;

這裡讀取到的資料叫做 「髒資料」 ;

這種隔離級別最低,一般在理論上存在,資料庫隔離級別一般都高於該級別;

2.2, 讀已提交:read committed

事務 a 和事務 b ,事務a提交的資料,事務b才能讀取到;

此種隔離級別高於讀未提交;

這種隔離級別可以避免「髒資料」,但是會導致「不可重複讀取」;

oracle預設隔離級別;

2.3, 可重複讀: repeatable read

事務a和事務b,事務a提交之後的資料,事務b讀取不到;

這種隔離級別高於讀已提交;

可以避免「不可重複讀取」,達到可重複讀取,但是會導致「幻像讀」;

mysql預設級別

2.4, 序列化: serializable

事務a和事務b,事務a在運算元據庫時,事務b只能排隊等待;

這種隔離級別很少使用,吞吐量太低,使用者體驗差;

可以避免「幻讀」, 每一次讀取的都是資料庫中真實存在的資料, 事務a與事務b序列,而不併發。

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...

事務隔離級別

四種隔離級別 隔離級別 髒 讀不可重複讀取 幻 像讀操作未提交 read uncommitted 是是 是讀操作已提交 read committed 否是 是可重複讀 repeatable read 否否 是快照否否 否可序列讀 serializable 否否 否 sql server 還支援使用行...

事務隔離級別

需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...