數據庫的併發問題,可以簡化成兩個事務操作數據庫,可以分爲三種情況:
1.兩個事務都在讀數據庫:這種情況並不會產生併發問題;
2.一個事務在讀數據庫,另一個事務在寫數據庫;
3.兩個事務都在寫數據庫
第二種情況
如果兩個事務對數據庫一讀一寫,可能就會造成我們常說的髒讀、不可重複讀、幻讀的問題:
髒讀:一個事務讀到了其他事務沒有提交的數據。
不可重複讀:一個事務更新了數據,使得另一個事務在同一次事務中查詢的數據不一致。
幻讀:一個事務插入了數據,使得另一個事務在同一次事務中查詢的數據不一致。
數據庫提供了4種不同的隔離級別,來解決或部分解決上述問題:
讀未提交:這種隔離級別會出現上述三種問題;
讀已提交:可以防止髒讀,但是仍然可能會出現不可重複讀和幻讀的問題,這是oracle默認的隔離級別;
可重複讀:可以防止髒讀和不可重複讀,仍然避免不了幻讀,這是mysql的默認隔離級別;
序列化:也叫串行化,可以防止上述三種問題。
第三種情況
兩個事務都對數據庫做讀操作可能會造成更新丟失。
假想場景:A事務開啓,B事務開啓,然後B事務向賬戶加了100元后提交,然後B事務也向賬戶加了100元,這時候B事務有兩種選擇,提交或者回滾,如果B事務提交,那麼賬戶中應該多200元,但事實上只多了100元,如果B事務回滾,那麼賬戶應該多100元,但事實上並沒有多。
上述場景就更新丟失,即一個事務的寫操作被其他事務的寫操作的提交或回滾抹去了。
注意:無論是mysql還是oracle還是其他常用的數據庫,更新丟失和髒讀等問題都已經做了很好的處理,不需要我們操心。