資料庫隔離級別,第二類更新丟失

2021-09-25 10:31:50 字數 2471 閱讀 2599

乙個事務中可以讀到別的事務任何資料,包括已提交 和 未提交的髒資料

乙個事務中只能讀到其他事物已經提交的資料

乙個事務在本事務提交之前讀到的資料不會受其它事務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更新丟失

這也是多執行緒下經典的併發問題。

解決方案:

通常可通過樂觀鎖或悲觀鎖解決。

悲觀鎖:

前置知識:

資料庫悲觀鎖有共享鎖和排他鎖兩種。

對於任何隔離級別,update,insert,delete會自動新增排它鎖。

非序列化隔離級別下,select是不會新增任何鎖的,序列化下,select自動新增共享鎖。

一行資料被加了共享鎖,其它事務也可以一起加共享鎖來訪問這個資料。但是不能加排它鎖來修改它。

一行資料被加了排它鎖,其它事務都不能對他加任何鎖。

在事務中,對於每個select操作都主動顯式地加上共享鎖或者排他鎖(最好是共享鎖),update,delete,insert已經自動加上排他鎖了

共享鎖獲取方式: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 讀取了乙個字段,...