问题描述: 事务控制失效 APP 中接收数据代码:
@Override
public ResponseStatus addThing(ThingData thingData, String deviceId) {
ResponseStatus responseStatus = new ResponseStatus(ReturnResponseUtil.getUrl(), thingData.getThingID());
//实体映射
ViewThingInfo viewThingInfo = new ViewThingInfo();
viewThingInfo = (ViewThingInfo) EntryMapping.mapping(viewThingInfo, thingData);
viewThingInfo.setViewDeviceId(deviceId);
viewThingInfo.setDeviceId(deviceId);
viewThingInfo.setCreateTime(new Date());
//存储处理过图片的子图信息
List viewThingSubimageInfoList = new ArrayList<>();
try {
//处理子图信息
List subImageInfoList = thingData.getSubImageInfoList().getSubImageInfoList();
for (SubImageInfo subImageInfo : subImageInfoList) {
ViewThingSubimageInfo viewThingSubimageInfo = new ViewThingSubimageInfo();
viewThingSubimageInfo = (ViewThingSubimageInfo) EntryMapping.mapping(viewThingSubimageInfo, subImageInfo);
viewThingSubimageInfoList.add(viewThingSubimageInfo);
}
} catch (Exception e) {
e.printStackTrace();
responseStatus.setStatusCode(ErrorResponseCode.INVALID_JSON_CONTENT_CODE);
responseStatus.setStatusString(ErrorResponseCode.INVALID_JSON_CONTENT_STR);
return responseStatus;
}
String msg = null;
boolean flag = false;
try {
flag = thingAdd(viewThingInfo, viewThingSubimageInfoList);
} catch (Exception e) {
logger.error("数据处理时发生错误", e);
msg = e.getMessage();
}
if (flag) {//数据处理成功
responseStatus.setStatusCode(ErrorResponseCode.OK_CODE);
responseStatus.setStatusString(ErrorResponseCode.OK_STR);
} else {//数据处理失败
responseStatus.setStatusCode(ErrorResponseCode.INVALID_JSON_CONTENT_CODE);
responseStatus.setStatusString("数据处理时发生错误,错误异常[" + msg + "]");
}
return responseStatus;
}
@Transactional
public boolean thingAdd(ViewThingInfo viewThingInfo, List viewThingSubimageInfoList) {
viewThingInfoMapper.insertViewThingInfo(viewThingInfo);
for (ViewThingSubimageInfo viewThingSubimageInfo : viewThingSubimageInfoList) {
viewThingSubimageInfo.setThingId(viewThingInfo.getId());
viewThingSubimageInfoMapper.insertViewThingSubimageInfo(viewThingSubimageInfo);
}
return true;
}
原因分析: ### 失效场景
- 用于非public的方法
- 该抛出异常的地方被捕获了,此时没有其它异常的话,不会有回滚
- 必须指定 rollbackFor = Exception.class,才可以回滚 checked 和 unchecked 所有异常,否则只会回滚 unchecked 非受检异常
- 在同一个类中,一个普通方法调用另外一个有注解(比如@Async,@Transational)的方法,注解是不会生效的
我这里的错误位失效场景4,在同一个类中进行调用
解决方案:
将数据库操纵的放到其它类中进行操作
@Override
public ResponseStatus addThing(ThingData thingData, String deviceId) {
ResponseStatus responseStatus = new ResponseStatus(ReturnResponseUtil.getUrl(), thingData.getThingID());
//实体映射
ViewThingInfo viewThingInfo = new ViewThingInfo();
viewThingInfo = (ViewThingInfo) EntryMapping.mapping(viewThingInfo, thingData);
viewThingInfo.setViewDeviceId(deviceId);
viewThingInfo.setDeviceId(deviceId);
viewThingInfo.setCreateTime(new Date());
//存储处理过图片的子图信息
List viewThingSubimageInfoList = new ArrayList<>();
try {
//处理子图信息
List subImageInfoList = thingData.getSubImageInfoList().getSubImageInfoList();
for (SubImageInfo subImageInfo : subImageInfoList) {
ViewThingSubimageInfo viewThingSubimageInfo = new ViewThingSubimageInfo();
viewThingSubimageInfo = (ViewThingSubimageInfo) EntryMapping.mapping(viewThingSubimageInfo, subImageInfo);
viewThingSubimageInfoList.add(viewThingSubimageInfo);
}
} catch (Exception e) {
e.printStackTrace();
responseStatus.setStatusCode(ErrorResponseCode.INVALID_JSON_CONTENT_CODE);
responseStatus.setStatusString(ErrorResponseCode.INVALID_JSON_CONTENT_STR);
return responseStatus;
}
String msg = null;
boolean flag = false;
try {
flag = viewThingInfoService.thingAdd(viewThingInfo, viewThingSubimageInfoList);
} catch (Exception e) {
logger.error("数据处理时发生错误", e);
msg = e.getMessage();
}
if (flag) {//数据处理成功
responseStatus.setStatusCode(ErrorResponseCode.OK_CODE);
responseStatus.setStatusString(ErrorResponseCode.OK_STR);
} else {//数据处理失败
responseStatus.setStatusCode(ErrorResponseCode.INVALID_JSON_CONTENT_CODE);
responseStatus.setStatusString("数据处理时发生错误,错误异常[" + msg + "]");
}
return responseStatus;
}
@Override
@Transactional
public boolean thingAdd(ViewThingInfo viewThingInfo, List viewThingSubimageInfoList) {
viewThingInfoMapper.insertViewThingInfo(viewThingInfo);
for (ViewThingSubimageInfo viewThingSubimageInfo : viewThingSubimageInfoList) {
viewThingSubimageInfo.setThingId(viewThingInfo.getId());
viewThingSubimageInfoMapper.insertViewThingSubimageInfo(viewThingSubimageInfo);
}
return true;
}



