压力测试时发现生成了相同的序号,根据日志分析发现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会这样,后续若是写到这方面的文章再详细说明.设计模式
幸亏在压力测试中发现这个问题,并无形成线上故障.有些问题不是作几笔交易就能说明清楚,必须在高并发高压力的测试下才能验证系统的健壮性.并发