參考:https://blog.csdn.net/qq_41445224/article/details/89299758
參考:https://blog.csdn.net/silyvin/article/details/79294508?tdsourcetag=s_pctim_aiomsg
在我們的實際開發中,往往會遇到更新數據字段的問題。如投票時,如果多人同時投票,是否存在在取數據並更新的時候,原始值是相同的,而后續的update操作會造成錯誤的數據?
比如,表名A,字段名為 number,如下的SQL語句: 語句1:update A set number=number+ 5 where id=1; 語句2:update A set number=number+ 7 where id=1; 假設這兩條SQL語句同時被mysql執行,id=1的記錄中number字段的原始值為 10,那么是否有可能出現這種情況: 語句1和2因為同時執行,他們得到的number的值都是10,都是在10的基礎上分別加5和7,導致最終number被更新為15或17,而不是22?
答案是不會
這個其實就是關系型數據庫本身就需要解決的問題。
首先,他們同時被MySQL執行,你的意思其實就是他們是並發執行的,而並發執行的事務在關系型數據庫中是有專門的理論支持的-ACID,事務並行等理論,所有關系型數據庫實現,包括Oracle,MySQL都需要遵循這個原理。
簡單一點理解就是鎖的原理。這個時候第一個update會持有id=1這行記錄的排它鎖,第二個update需要持有這個記錄的排它鎖的才能對他進行修改,正常的話,第二個update會阻塞,直到第一個update提交成功,他才會獲得這個鎖,從而對數據進行修改。
也就是說,按照關系型數據庫的理論,這兩個update都成功的話,id=1的number一定會被修改成22。如果不是22,那就是數據庫實現的一個嚴重的bug。