工作中踩到的一個坑 ,一個報錯,導致整個服務不能用。工程部署四個節點,請求是按輪詢機制分發的,所以請求四次報錯,整個系統癱瘓。記錄下 。
項目環境:spring +Mybaties +mycat +Druid+mysql,
很早前寫的一個新增方法,后來同事把表遷移到別的庫去了 ,但是日志表又沒有遷移 ,所以新增的表和日志表不在一個物理庫中,而新曾的方法又開啟了spring事務,
但是系統mycat把分布式事務關了 ,沒有開分布式事務,然后請求過來就報錯:如標題不支持分布式事務。而且,一報錯,后續進來的請求,只要開啟了事務,就會報同樣的錯。
這個我現在都沒弄清楚。請求事務方法如下代碼:
public int save(List<GwAcceptCriteria> entityList) throws Exception { // 方法加入spring事務支持。 if(null == entityList||entityList.isEmpty()) return 0; ArrayList<BaseLog> Logs = new ArrayList<>(); ArrayList<GwAcceptCriteria> saveData = new ArrayList<>(); for (GwAcceptCriteria gwAcceptCriteria : entityList) { gwAcceptCriteria.setCreateEmp(BaseContextUtil.getCurrentUser()); gwAcceptCriteria.setCreateTime(DateUtils.getNow()); gwAcceptCriteria.setModifyTime(DateUtils.getNow()); BaseLog log = getBLog(OperateTypeUtil.ADD_TYPE , null, gwAcceptCriteria); Logs.add(log); if(isDuplicates(gwAcceptCriteria)) {// 校驗數據庫數據是否重復 數據庫節點DB1 continue; } saveData.add(gwAcceptCriteria); } if(saveData.isEmpty()) return 0; int num = gwAcceptCriteriaMapper.insertList(saveData); baseLogManager.saveList(Logs); // 保存實體日志 數據庫節點DB2 logger.info(">>>>>>>>>>> 官網收寄標准管理-->{}<--數據{}條 ", OperateTypeUtil.ADD_TYPE,num); return num; }
報錯異常如下圖片:
解決方法:
1.把方法內操作的數據表統一到一個物理庫。
2.關閉方法的事務支持。