1、髒讀
--最嚴重,杜絕發生
2、不可重複讀
3、幻讀(虛讀)
假設a向b轉賬100元,對應的sql語句如下:
開啟事務
update account set money=money-100where name='a';
update account set money=money+100where nam='b';
兩條sql語句執行完,b查詢自己的賬戶多了100元。
b走後,a將事務進行回滾,這樣b就損失了100元。
乙個事務讀取了另乙個事務沒有提交的資料,非常嚴重。應當盡量避免髒讀。
l 例如: 銀行想查詢a賬戶的餘額,第一次查詢的結果是200元,a向賬戶中又存了100元。此時,銀行再次查詢的結果變成了300元。兩次查詢的結果不一致,銀行就會很困惑,以哪次為準。
l 和髒讀不同的是:髒讀讀取的是前一事務未提交的資料,不可重複度
讀取的是前一事務已提交的事務。
l 很多人認為這有啥好困惑的,肯定是以後面的結果為準了。我們需要考慮這樣一種情況,查詢a賬戶的餘額,乙個列印到控制台,乙個輸出到硬碟上,同乙個事務中只是順序不同,兩次查詢結果不一致,到底以哪個為準,你會不會困惑呢?
當前事務查詢a賬戶的餘額為100元,另外乙個事務更新餘額為
300元並提交,導致當前事務使用同一查詢結果卻變成了300元。
l 指在乙個事務中讀取 另乙個事務 插入或刪除資料記錄,導致當前事務 讀取資料前後不一致。
l 丙存款100元但未提交,這時銀行做報表統計總額為500元,丙將事務提交,銀行再統計就變成了 600元,兩次統計結果不一致,銀行便會不知所措。
乙個事務 讀取 另乙個事務已經提交的資料,強調的是 記錄數 的變化,常有sql型別為 insert和 delete。
虛讀和不可重複讀的區別:
虛讀 強調的是資料表記錄數 的變化,主要是 insert 和 delete 語句。
不可重複讀 強調的是資料表內容 的變化,主要是 update 語句。
serializable(序列化):可避免髒讀、不可重複讀、虛讀情況的發生。
repeatable read(可重複讀):可避免 髒讀、不可重複讀, 不可避免 虛讀。mysql採用可重複讀。
read committed(讀已提交):可避免髒讀,不可避免 不可重複讀、虛讀。oracle採用讀已提交。
read uncommitted(讀未提交):不可避免髒讀、不可重複讀、虛讀。
事物隔離級別
自然也是支援四種事務隔離級別的 read uncommitted,read commit,repeatable read serializable,下面就分別最四種隔離級別在實現的鎖機制做乙個簡介 serializable 1 這種隔離級別對資料的要求最為嚴格,自然也是效能最差的一種隔離級別。在所有...
事物隔離級別
隔離級別從松到緊 讀未提交,讀提交 重複讀,序列化。讀未提交 可能會出現髒讀的情況 例子 你去買5個包子。人多。店員拿的急多方乙個,袋子裡有6個,這個時候,你眼睛一瞟。心裡美滋滋。付錢的時候老闆檢查了一下,發現多了乙個,就拿走了乙個,然後你付錢走人 提交事務 這時候你就發現實際上袋子裡只有5個,但是...
事物隔離級別
在分布式的系統中,通常會有多個執行緒連線到資料庫中同時對乙個表進行操作 這裡的同時並不表示同乙個時間點,而是同時競爭cpu的資源,至於如何排程,就要看執行緒和作業系統如何進行排程了 這種情況下如果會話的事物設定不當,就會導致資料混亂,常常會出現以下三種情況 假設現在系統中有兩個會話a和b,同時對錶t...