壓力測試時發現生成了相同的序號,根據日誌分析發現select ... for update沒有鎖住某一行的數據,從而致使序號重複java
public abstract class BaseController {
private ScBaseController succNext = null;
private ScBaseController failNext = null;
public DataMessage process(DataMessage msg) throws ScBaseException {
DataMessage respMsg = this.doProcess(msg);
// 執行成功
if (ExecuteResultEnum.SUCCESS.equals(respMsg.getExecuteResult())) {
if (this.succNext != null) {
return this.succNext.process(respMsg);
} else {
return respMsg;
}
}
// 執行失敗
else {
if (this.failNext != null) {
return this.failNext.process(respMsg);
} else {
return respMsg;
}
}
}
@Transactional // 這裏的事務註解沒有做用
public abstract DataMessage doProcess(DataMessage msg);
複製代碼
看過不少文章都說過不能在同一個類中使用沒有@Transactional的方法調起有@Transactional的方法,這個是Spring動態AOP的機制決定的,必須緊記這個教訓.至於爲何動態AOP會這樣,後續若是寫到這方面的文章再詳細說明.設計模式
幸虧在壓力測試中發現這個問題,並無形成線上故障.有些問題不是作幾筆交易就能說明清楚,必須在高併發高壓力的測試下才能驗證系統的健壯性.併發