事务方式内无法捕获异常
想在一个事务中捕获异常并重新操作数据库,但是调试发现异常是在方法结束的时候才报出,无法捕获,有没有什么解决方案,代码如下
@Transactional
public void click(Goods goods) throws Exception {
if(goods != null) {
try {
GoodsCount goodsCount = goodsCountDao.findUniqueBy(GoodsCount.PROPERTY_NAME_FOR_GOODS_ID, goods.getId());
if(goodsCount == null) {
goodsCount = new GoodsCount();
goodsCount.setGoods(goods);
goodsCount.setId(UuidUtils.randomUuid());
}
goodsCount.setClickCount(goodsCount.getClickCount() + 1);
goodsCountDao.save(goodsCount);
} catch(Exception e) {
LoggerUtils.logException(e);
//版本异常或者违反唯一约束
if(e instanceof StaleObjectStateException || e instanceof ConstraintViolationException || e instanceof DataIntegrityViolationException) {
//再次加重重新处理一遍
GoodsCount goodsCount = goodsCountDao.findUniqueBy(GoodsCount.PROPERTY_NAME_FOR_GOODS_ID, goods.getId());
goodsCount.setClickCount(goodsCount.getClickCount() + 1);
goodsCountDao.save(goodsCount);
} else {
throw e;
}
}
}
}
觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。
不会啊,我在调用这个service的controller方法里再次捕获异常,就能捕获到
那可能是事务本身的异常了,在方法结束后,事务结束前。打印下异常堆栈看看呢?
DEBUG发现,insert语句是在整个方法结束后才执行了,是不是可以这样的:insert/update语句被事务挂起来,等到事务结束的时候才一并执行,因为代码中的save实际并没有执行sql,所以不会报错
觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。
不会啊,我在调用这个service的controller方法里再次捕获异常,就能捕获到
那可能是事务本身的异常了,在方法结束后,事务结束前。打印下异常堆栈看看呢?
DEBUG发现,insert语句是在整个方法结束后才执行了,是不是可以这样的:insert/update语句被事务挂起来,等到事务结束的时候才一并执行,因为代码中的save实际并没有执行sql,所以不会报错
事务就是这样的,多个sql操作(delete、update),最后事务结束的时候才会提交。
那是不是就没有办法在这个事务的方法内捕获异常并处理了