2個回答
-
事實上,在很多業務場景中,重複讀取不同的資料是對的,(後一次是最新的資料),但重複讀取相同的資料是錯誤的。
當交易隔離級別設定為不可重複讀取時,可以在交易中重複讀取操作**,這似乎很矛盾,就像在十字路口豎立了乙個牌子,上面寫著“不要闖紅燈”,但實際上,你也可以闖入,那個提示只是告訴你可能有危險! 同樣的道理,其實在“不可重複讀取”級別下重複讀取是可以的,mysql本身不會因為你的重複讀取而被迫報錯或終止,但可能會因為重複讀取而造成問題,或者可能沒有問題,不代表會有錯誤, 有些場景,兩次讀取是不同的,第二次是最新的資料,可能確實不錯,但在某些場景下,重複讀取資料保持不變(顯然資料是由其他交易更新的)可能是錯誤的。
至於哪些場景會有問題,我覺得應該是那種產生瞬時資料的場景,比如今天12:00:00,訪問次數是1000,乙個交易在這個時間點就要拿1000了,然後回來生成乙個報告,這個時候,另乙個交易把這個1000改成了2000, 但這個 2000 年是 12 個:
00:01 訪問量,這種場景,重複讀取有問題,因為不準確。 但是有些場景,比如只需要生成最新的報告,不問時間,越新越好,這裡重複讀取沒有問題,而且有類似的餘額處理,如果是樓上那個刷卡的場景,更新和兩次讀取不一樣(後面跟著最新資料)我覺得是對的, 所以需要根據業務場景,用正確的隔離級別和適當的**來判斷是對還是錯。
-
編乙個刷卡的場景,你要支付100元,你在一筆交易中選擇乙個賬戶,發現它的餘額100元就夠用了,於是你啟動了減餘額操作,做更新xx設定餘額=餘額-100,其中...因此,其他交易的餘額在更新前變為 50,在更新後變為 -50。
相關回答