1.為什麼要選擇隔離級別?
通過例子說明隔離級別的必要性:
假設乙個場景,一對夫妻共用乙個賬戶,妻子喜歡網上支付,丈夫喜歡刷卡支付。
第一類丟失情況:
整個過程中只有老公消費1000元,而最後時刻,老婆回滾事務,恢復到了原來的10000元,這不符合實際。這樣的兩個事務併發,乙個提交,乙個回滾導致的不一致成為第一類丟失更新,不過大部分資料庫(mysql,oracle)基本上消滅了這類丟失更新,所以不做過多的闡述。
第二類丟失情況:
整個過程存在兩處交易,老公消費1000元,老婆消費1000元,餘額應該是8000元,但這裡結果卻是9000元,顯然不符合常理。這是因為兩個事務都提交了,在不同的事務中,無法探知其他事務的的操作導致的,
通過上邊2中情況,可知隔離級別的重要性。
2.什麼是隔離級別?
隔離級別為了克服事務之間協助的一致性,資料庫標準規範中定義了事務之間的隔離級別,來在不同的程度上減少出現丟失更新的可能性。
3.隔離級別有哪些?
1>.髒讀
在髒讀級別中,乙個事務可以讀取到另乙個事務未提交的資料
由於設定隔離級別為臟讀,所以事務一和事務二可以相互讀取資料。
在上面的情況中事務一在提交的時候讀取到事務二未提交的資料,事務一提交後的結果為8000
後面事務二回滾,讀取到了事務一提交的資料8000,所以回滾事務為8000.
這也是不符合常理的
2>.讀/寫提交
在讀/寫提交中,事務之間只能讀取到已經提交的資料。
設定 隔離級別為讀/寫提交。事務一在提交的時候讀取不到事務二未提交的資料,所以提交事務後餘額為9000
事務二在回滾的時候可以讀取到事務一提交的時候,回滾結果為9000,符合常理。
3>.可重複讀
即可以重複讀取資料。為了保證資料的一致性。
在事務一提交之前,事務二花了9000元並且已經提交事務。但是對於事務一來說,他在讀取的時候是10000元。但是當他結賬的時候餘額已經變成了1000元,但是他並沒有顯示。老公也並不知道自己的餘額不足,導致他在結賬的時候(提交)由於可以讀取到事務二已經提交的資料,發現自己餘額不足,很尷尬。
為了避免這種尷尬,可重複讀隔離級別就出現了,它可以重複的讀取。
可重複讀是針對於同一條資料而言的,當同一條資料在讀/寫提交後,他會去重複讀取,從而保證資料的一致性。
這樣老公在結賬的時候就會看到自己的餘額為1000,而不是在提交事務的時候才發現自己餘額不足。
4>.序列化
序列化是為了消除幻讀而制定的規則,它是一種讓sql按照順序讀寫的方式。
老婆在查詢消費記錄的時候查到了10條,但當列印的時候列印出來11條,在這期間他並不知道老公消費了,他會認為這一條是錯誤列印,虛幻出來的。
採用幻讀後,老婆查詢出來的資料不會包含老公剛剛消費的。
4.各類隔離級別和產生的現象
5.怎樣選擇隔離級別
在應用的時候,不單單要考慮資料的一致性,還要考慮系統的效能,從髒讀到序列化,效能直線下降。採用更高的隔離級別,會嚴重壓制發,導致大量執行緒掛起,知道獲取鎖才能進行下一步操作,而恢復時有需要大量的等待時間。
如果併發量比較大的話一般採用讀/寫提交,但在併發性很小甚至可以忽略的時候,一般採用序列化。
資料庫事務隔離級別理解
資料庫事務的隔離級別有4個,由低到高依次為 read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted r...
MSSQL隔離級別理解
資料庫的六種隔離級別的自我理解 隔離級別 isolation level 分類 未提交事務 read uncommitted 已提交事務 read committed 可重複度 repeatableread 可序列化 serializable 最高端別 其實這幾種隔離級別最終是對資料庫增刪改查進行的...
資料庫事物隔離級別通俗理解
總的說,資料庫事物無非就兩種 讀取事物 select 修改事物 update,insert 在沒有事物隔離控制的時候,多個事物在同一時刻對同一 資料的操作可能就會影響到最終期望的結果,通常有四種情況 1 兩個更新事物同時修改一條資料時,很顯然這種情況是最嚴重的了,程式中無論如何也不能出現這種情況,因...