事務可重複讀採坑

1. 事務可重複讀採坑

1.1. 問題

  1. 今天碰到個事務幻讀的狀況,不容易啊,這不是事務間形成的問題,而是rpc調用產生的問題,實際上業務比較規範也不會出現這樣的問題。
  2. 具體狀況是系統A方法a開啓required事務,在事務方法中rpc調用了系統B,生成了一條訂單,而以後系統A又用sql查詢了這條訂單,會發現根本查不到

1.2. 緣由

  • 經過select @@tx_isolation;查詢mysql的事務隔離狀況會發現,mysql默認是REPEATABLE-READ可重複讀,映射到代碼就是在一個事務內,用一樣的條件查詢數據庫查詢到的數據是相同的,哪怕別的系統在事務期間插入了數據,你也讀不到

1.3. 解決辦法

  • mysql使用這樣的隔離級別是有道理的,避免重複讀取的不許確,只要這個庫都歸一個系統管理,咱們就能夠避免我上述的問題
  • 但既然我如今的遺留業務已經成爲了這樣的邏輯,在不能修改其它系統的前提下,我只能在代碼上下功夫,我對讀取訂單數據的方法c設置了傳播級別爲REQUIRES_NEW,也就是新起一個事務,那它就不會受到父事務的影響,還要確保進入該方法前插入訂單已提交就行
  • 但這樣帶來的問題是,方法c若執行正確,但包裹了方法c的方法a中其它行報錯,則不能回滾方法方法a的執行內容
  • 這樣我又須要寫額外的補償代碼,當方法a執行錯誤,且問題不是在方法c時,我要跳過方法c進行方法調用補償

1.4. 總結

  • 搞的這麼複雜,實際上上面的改造在能夠動其餘系統的狀況下,最簡單就是獲取訂單信息不該該系統A來寫sql讀,既然系統B管理了訂單表那麼關於它的增刪改查都由它提供就不會產生上述問題了
相關文章
相關標籤/搜索