關於數據庫併發問題總結

數據庫的併發問題,可以簡化成兩個事務操作數據庫,可以分爲三種情況:

1.兩個事務都在讀數據庫:這種情況並不會產生併發問題;

2.一個事務在讀數據庫,另一個事務在寫數據庫;

3.兩個事務都在寫數據庫

第二種情況

如果兩個事務對數據庫一讀一寫,可能就會造成我們常說的髒讀、不可重複讀、幻讀的問題:

髒讀:一個事務讀到了其他事務沒有提交的數據。

不可重複讀:一個事務更新了數據,使得另一個事務在同一次事務中查詢的數據不一致。

幻讀:一個事務插入了數據,使得另一個事務在同一次事務中查詢的數據不一致。

數據庫提供了4種不同的隔離級別,來解決或部分解決上述問題:

讀未提交:這種隔離級別會出現上述三種問題;

讀已提交:可以防止髒讀,但是仍然可能會出現不可重複讀和幻讀的問題,這是oracle默認的隔離級別;

可重複讀:可以防止髒讀和不可重複讀,仍然避免不了幻讀,這是mysql的默認隔離級別;

序列化:也叫串行化,可以防止上述三種問題。

第三種情況

兩個事務都對數據庫做讀操作可能會造成更新丟失。

假想場景:A事務開啓,B事務開啓,然後B事務向賬戶加了100元后提交,然後B事務也向賬戶加了100元,這時候B事務有兩種選擇,提交或者回滾,如果B事務提交,那麼賬戶中應該多200元,但事實上只多了100元,如果B事務回滾,那麼賬戶應該多100元,但事實上並沒有多。

上述場景就更新丟失,即一個事務的寫操作被其他事務的寫操作的提交或回滾抹去了。

注意:無論是mysql還是oracle還是其他常用的數據庫,更新丟失和髒讀等問題都已經做了很好的處理,不需要我們操心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章