讀寫分離-延時問題-1
阿新 • • 發佈:2018-07-14
記錄 reat 需要 turn exception int 解決辦法 獲取 log日誌
代碼主要邏輯如下:
1 public void createCoupons(ReqCreateAndBindCouponDTO request) { 2 // 1.創建優惠券組及多張優惠券(寫庫) 3 int groupId = createCouponGroupAndCoupons(request); 4 // 2.根據券組ID獲取生成的優惠券(讀庫) 5 List<CouponDTO> resCoupons = couponService.selectCoupon(groupId); 6 if(resCoupons == null || resCoupons.size() == 0) { 7 throw new RuntimeException("查詢優惠券失敗,groupId=" + groupId); 8 } 9 // 3.返回 10 return resCoupons; 11 }
業務邏輯:需要創建一組優惠券,(一個優惠券組下可以有多張優惠券),創建優惠券後,根據優惠券組ID查詢出其下的優惠券,將券號返回!本著讀寫分離模式,修改數據庫表操作在寫庫,查詢數據操作在讀庫,所以步驟一應該是寫庫,步驟二應該是讀庫
問題:在實際操作中會發現,執行第二步的時候經常會拋出如代碼第7行的異常
分析:讀寫分離采用了主從復制,當寫庫有修改操作時,會記錄在binlog日誌中,完了從庫會同步binlog日誌中的信息,進而保持跟主庫數據一致,但主庫修改到從庫同步完成,是需要時間的而代碼在執行第完第3行,會立即執行第5行即查詢操作,而此時,從庫的同步可能並為完成,所以就會造成查詢的resCoupons 為空。
解決辦法:在應對此類問題時最簡單的辦法就是將步驟二的查詢操作改為寫庫,即從主庫查詢數據,此時就避免了由於主從延時問題導致從庫來不及同步的問題!額,雖然說查詢操作應該從從庫查詢,但總得保證功能不會出錯吧,然後再考慮性能問題
讀寫分離-延時問題-1