共有四種:
讀未提交(read uncommitted)
定義:乙個事務可以讀取另乙個未提交事務的資料。
事例:老闆給程式設計師發工資,程式設計師的工資是3.6萬/月。但發工資時老闆不小心按錯數字,按成3.9萬/月,改錢已打到程式設計師賬戶,但事務還沒提交,這時,程式設計師去檢視自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。但是老闆及時發現不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。
分析:程式設計師這個月工資還是3.6萬,但是程式設計師看到的是3.9萬。他看到的是老闆還沒提交事務時的資料。這就是「髒讀」。
讀提交(read committed)
定義:乙個事務要等另乙個事務提交後才能讀取資料。
事例:程式設計師拿著信用卡去享受生活(卡里有3.6萬),當他買單時(程式設計師事務開啟),收費系統事先檢測到他的卡里有3.6萬,此時,程式設計師的妻子要把錢全部轉出充當家用,並提交。當收費系統扣款時,在檢測到卡里的金額,發現已經沒錢了(第二次檢測要等妻子轉出金額事務提交完成)。程式設計師很鬱悶,明明卡里是有錢的。。。
分析:如果有事務對資料進行更新(update)操作時,讀操作要等這個更新操作事務提交後才能讀取資料,可以解決髒讀問題。但事例中,出現乙個事務範圍內兩個相同查詢卻返回了不同資料,這就是不可重複讀。
重複讀(repeatable read)
定義:開始讀取資料(事務開啟)時,不允許修改操作。
事例:程式設計師拿著信用卡去享受生活(卡里有3.6萬),當他買單時(事務開啟,不允許其他事務的update修改操作),收費系統事先檢測到卡里有3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。
分析:重複讀可以解決不可重複讀問題,不可重複讀對應的是修改,即update操作。但可能還會有幻讀問題。幻讀對應的是插入insert操作,而不是update操作。
序列化(serializable)
定義:序列化是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀和幻讀。但這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。
例項:程式設計師一天去消費,花了2千元,然後他的妻子去檢視他今天的消費記錄(全表掃瞄,妻子事務開啟),看到確實是花了2千元,就這個時候,程式設計師花了1萬買了一部電腦,即新增insert了一條消費記錄,並提交。當妻子列印程式設計師的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現幻覺,這就是幻讀。
總結:1.髒讀:事務a提取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料。
2.不可重複讀:事務a多次讀取同一資料,事務b在事務a多次讀取的過程中,對資料做了更新並提交,導致事務a多次讀取同一資料時,結果不一致。
3.幻讀:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生幻覺一樣,這就叫幻讀。
4.不可重複讀和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需要鎖住滿足條件的行,解決幻讀需要鎖表。
5.隔離級別越高,越能保證資料的完整性和一致性,但對併發效能的影響也越大。
6.大多數資料庫預設的事務隔離級別是「讀提交」,比如sql server,oracle。mysql的預設隔離級別是可重複讀。
事務隔離級別
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 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...