请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

店铺注册之Service层实现,事物回滚问题

/**
 * 文件在系统中的存储基本路径
 * @return
 */
public static String getImgBasePath() {
	                
	String os = System.getProperty("os.name");
	String basePath="";
	if(os.toLowerCase().startsWith("win")) {
		basePath="D:/project/o2o/image/";
	}else {
		basePath="/Users111/lifuqing/project/image/";
	}
	basePath = basePath.replace("/", seperator);
	return basePath;
}

如上段代码显示,我们讲Users故意写成Users111
则下段代码从生产水印开始,开始包异常.

/**
	 * 处理缩略图,并生成新的生成图片的相对路径值
	 * @param thumbnail
	 * @param targetAddr
	 * @return
	 */
	public static String generateThunbnail(File thumbnail,String targetAddr) {
		//年月日时分秒+五位随机数 的字符串作为文件名字
		String realFileName = getRandomFileName();
		
		//获取文件的后缀
		String extension = getFileExtension(thumbnail);
		
		//创建目录
		makeDirPath(targetAddr);
		
		//文件地址的拼接
		String relativeAddr = targetAddr+realFileName+extension;
		logger.debug("current relativeAddr is :"+relativeAddr);
		//生成一个新的文件
		File dest=new File(PathUtil.getImgBasePath()+relativeAddr);
		logger.debug("current complete addr is :"+PathUtil.getImgBasePath()+relativeAddr);
		//生产水印
		try {
			Thumbnails.of(thumbnail)
			.size(200, 200)
			.watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath+"/watermark.jpg")), 0.25f)
			.outputQuality(0.8)
			.toFile(dest);
		}catch(RuntimeException e) {
			logger.error(e.toString());
			e.printStackTrace();
		}catch(Exception e) {
			logger.error(e.toString());
			e.printStackTrace();
		}
		
		//返回添加水印的相对地址
		return relativeAddr;
		
	}

上段代码会被com.imooc.o2o.service.impl.ShopServiceImpl.addShopImg.这段代码调用,详情如下:

private void addShopImg(Shop shop, File shopImg) {
		// 货物shop图片目录的相对值路径
		String dest = PathUtil.getShopImagePath(shop.getShopId());
		String shopImgAddr = ImageUtil.generateThunbnail(shopImg, dest);
		shop.setShopAddr(shopImgAddr);
		
	}

下面这段代码com.imooc.o2o.service.impl.ShopServiceImpl.ShopExecution.要求数据库具有回滚功能,但是他调用了上段代码com.imooc.o2o.service.impl.ShopServiceImpl.addShopImg.,
出现了异常;
想问一下老师,这种情况如果addShop方法内调用的其它方法出现了异常,系统没有回滚,如何解决.

	@Transactional//事物
	public ShopExecution addShop(Shop shop, File shopImg) {
		//空值判断
		if(shop == null) {
			return new ShopExecution(ShopStateEnum.NULL_SHOP);
		}
		try {
			//给店铺信息赋初始值
			shop.setEnableStatus(0);
			shop.setCreateTime(new Date());
			shop.setLastEditTime(new Date());
			
			//添加店铺信息
			int effectedNum =shopDao.insertShop(shop);
			
			//检查是商铺信息否插入成功
			if(effectedNum <=0) {
				//这种方式抛出异常,事物才会回滚
				throw new ShopOperationException("店铺创建失败");
			}else {
				if(shopImg !=null) {
					try {
						//图片与商铺信息合并
						addShopImg(shop,shopImg);
					}catch(Exception e) {
						throw new ShopOperationException("addShopImg error ");
					}
					//更新店铺的图片地址
					effectedNum =shopDao.updateShop(shop);
					if(effectedNum <=0) {
						throw new ShopOperationException("更新图片失败");
					}
				}
			}
		}catch(Exception e) {
			throw new ShopOperationException("addShop error:"+e.getMessage());
		}
		return new ShopExecution(ShopStateEnum.CHECK,shop);
	}

正在回答 回答被采纳积分+3

1回答

翔仔 2019-03-07 21:00:54

同学好,从addShopImg抛出的异常会被

					try {
						//图片与商铺信息合并
						addShopImg(shop,shopImg);
					}catch(Exception e) {
						throw new ShopOperationException("addShopImg error ");
					}

捕获,然后抛出ShopOperationException,因此会回滚呢。。

但是如果生成图片了,如果抛出异常,虽然会被回滚,但是图片没办法回滚,需要在catch里面执行删除语句。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号