首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

事务方式内无法捕获错误

2014-01-17 
事务方式内无法捕获异常想在一个事务中捕获异常并重新操作数据库,但是调试发现异常是在方法结束的时候才报

事务方式内无法捕获异常
想在一个事务中捕获异常并重新操作数据库,但是调试发现异常是在方法结束的时候才报出,无法捕获,有没有什么解决方案,代码如下


@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块,都做了什么处理。
[解决办法]
这恐怕和事物的原子性相关吧。
你期望的操作应该不能够实现。
[解决办法]
引用:
Quote: 引用:

觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。


不会啊,我在调用这个service的controller方法里再次捕获异常,就能捕获到

那可能是事务本身的异常了,在方法结束后,事务结束前。打印下异常堆栈看看呢?
[解决办法]
请参考http://www.360doc.com/content/12/1109/18/6161903_246870991.shtml
[解决办法]
楼主应该打印看下具体的异常,可能不是instanceof 列出的,也可能是if(e instanceof StaleObjectStateException---){} 中的抛出的,楼主可以在方法的调用处try catch 可能的异常- -
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。


不会啊,我在调用这个service的controller方法里再次捕获异常,就能捕获到

那可能是事务本身的异常了,在方法结束后,事务结束前。打印下异常堆栈看看呢?

DEBUG发现,insert语句是在整个方法结束后才执行了,是不是可以这样的:insert/update语句被事务挂起来,等到事务结束的时候才一并执行,因为代码中的save实际并没有执行sql,所以不会报错


事务就是这样的,多个sql操作(delete、update),最后事务结束的时候才会提交。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

觉得LZ捕获不到的原因是因为调用其它方法里面捕获了异常,但是没有再次抛出来。
看看你的findUniqueBy、save等方法,是否存在try-catch块,都做了什么处理。


不会啊,我在调用这个service的controller方法里再次捕获异常,就能捕获到

那可能是事务本身的异常了,在方法结束后,事务结束前。打印下异常堆栈看看呢?

DEBUG发现,insert语句是在整个方法结束后才执行了,是不是可以这样的:insert/update语句被事务挂起来,等到事务结束的时候才一并执行,因为代码中的save实际并没有执行sql,所以不会报错


事务就是这样的,多个sql操作(delete、update),最后事务结束的时候才会提交。

那是不是就没有办法在这个事务的方法内捕获异常并处理了

如果sql写错了,想在事务内捕获,注解方式估计没戏。手动管理实务,应该可以实现吧。

热点排行