乙個事務中可以讀到別的事務任何資料,包括已提交 和 未提交的髒資料
乙個事務中只能讀到其他事物已經提交的資料
乙個事務在本事務提交之前讀到的資料不會受其它事務crud的影響,所以前後讀的資料是一致的,可以重複讀
注意:實際上這個可重複讀只是針對讀(select)所看到的的資料是可以重複讀的,僅此而已;
為什麼這麼說呢?
1當你事務還沒提交,這時外界插入了一條id=10的資料,你select檢視,發現沒有這條資料,你也想插入id=10的資料,是會報錯的,因為有衝突,這就是出現了幻讀,資料庫感知的是實際的環境,而你事務還沒提交之前,你select看到的資料是虛幻的,這就是這個隔離級別的一大特點。
2當你update 表 set money = money+100,進行這種操作時,這個money是會取到真實的money的。舉例:你先select 發現money是100,然後另外乙個人開啟事務並提交把100更新成200,這時候你再select發現還是100,然後你update 表 set money = money+100,這時候實際上會被修改為300而不是200,但是如果你是update 表 set money = 200,就真的變成200,這還是會發生第二類更新丟失。
所以說為什麼說!!可重複讀可以解決第二類更新丟失啊??????
明明就不可以!!!!
而且,可重複讀到底有什麼好處啊,沒覺得它比讀已提交好在哪啊!!!!
某乙個事務select的時候會對對應行加上共享鎖,這時其他事務直接無法更新改資料
這時最高的隔離級別,不會出現任何問題。
通過對select操作加上共享鎖解決第二類更新問題和幻讀問題。
某乙個事務讀到別的事務還沒提交的資料,換種說法:即將讀到被回滾的虛假資料
乙個事務沒提交之前,讀寫某一行的資料前後不一致
(這個不一致就不一致咯有什麼問題嗎)
近似髒讀,就是讀取了到了錯誤的資料,舉例:別的事務新增了一條資料,但是我這邊沒看到,當我我也想新增一條同樣的資料時系統報錯說已經存在這條資料了。
事務a事務b
開啟事務
開啟事務
查詢到餘額為1000
查詢到餘額為1000
-新增100,修改為1100
-提交事務
新增100,修改為1100
回滾事務
餘額變成1000 事務b更新丟失
現在所有的隔離級別都不會出現這種錯誤,可以忽略。
事務a事務b
開啟事務
開啟事務
查詢到餘額為1000
查詢到餘額為1000
-新增100,修改為1100
-提交事務
新增100,修改為1100
提交事務
餘額變成1100 事務b更新丟失
這也是多執行緒下經典的併發問題。
解決方案:
通常可通過樂觀鎖或悲觀鎖解決。
悲觀鎖:
前置知識:在事務中,對於每個select操作都主動顯式地加上共享鎖或者排他鎖(最好是共享鎖),update,delete,insert已經自動加上排他鎖了資料庫悲觀鎖有共享鎖和排他鎖兩種。
對於任何隔離級別,update,insert,delete會自動新增排它鎖。
非序列化隔離級別下,select是不會新增任何鎖的,序列化下,select自動新增共享鎖。
一行資料被加了共享鎖,其它事務也可以一起加共享鎖來訪問這個資料。但是不能加排它鎖來修改它。
一行資料被加了排它鎖,其它事務都不能對他加任何鎖。
共享鎖獲取方式:select * from account where name=『jack』 lock in share mode;
排它鎖獲取方式:select * from account where name=『jack』 for update;
(注意!!單純的select是不會新增任何鎖的,也就是說select在非序列化的隔離級別之下是不受任何控制的)
或者直接把事務隔離設為序列化set tx_isolation=『serializable』; 這個隔離級別其實恰好就是上訴的加共享鎖的方法(已經過測試)
所以說在序列化的隔離級別下是不會出現第二類更新丟失問題的
版本號機制,增加乙個版本或者時間戳的列,對於進行修改行時先獲取版本號,修改的時候比較一下版本號是否一致,一致再進行修改並將版本號加一更新。
附:
(上圖可重複讀解決第二類更新那裡值得商榷)
資料庫第一類第二類丟失更新
第一類丟失更新 回滾丟失,lost update a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬就可以看出來 時間取款事務a 轉賬事務b t1 開始事務 t2 開始事務t3 查詢賬戶餘額為1000元 t4 查詢賬戶餘額為1000元 t5 匯入1...
資料庫第一類第二類丟失更新
第一類丟失更新 回滾丟失,lost update a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬就可以看出來 a事務在撤銷時,不小心 將b事務已經轉入賬戶的金額給抹去了。sql92沒有定義這種現象,標準定義的所有隔離級別都不允許第一類丟失更新發...
JDBC資料庫事務(二) 資料庫的隔離級別
1.對於同時執行的多個事務,當這些事務訪問資料庫中相同的資料時,如果沒有採取必要的隔離機制,就會導致各種併發問題 髒讀 對於兩個事物t1,t2,t1讀取了已經被t2更新但還沒有被提交的字段。之後,若t2回滾,t1讀取的內容就是臨時且無效的。不可重複讀 對於兩個事物 t1,t2,t1 讀取了乙個字段,...