代碼主要邏輯以下:數據庫
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行的異常spa
分析:讀寫分離採用了主從複製,當寫庫有修改操做時,會記錄在binlog日誌中,完了從庫會同步binlog日誌中的信息,進而保持跟主庫數據一致,但主庫修改到從庫同步完成,是須要時間的而代碼在執行第完第3行,會當即執行第5行即查詢操做,而此時,從庫的同步可能併爲完成,因此就會形成查詢的resCoupons 爲空。日誌
解決辦法:在應對此類問題時最簡單的辦法就是將步驟二的查詢操做改成寫庫,即從主庫查詢數據,此時就避免了因爲主從延時問題致使從庫來不及同步的問題!額,雖說查詢操做應該從從庫查詢,但總得保證功能不會出錯吧,而後再考慮性能問題code