从数据库中删除并从FileSystem事务中删除?

时间:2015-07-03 17:22:15

标签: java grails groovy gorm

我有以下方法从文件系统中删除图像及其相应的记录。

Response.AddCacheDependency(new CacheDependency(filename));

我想让两个删除操作都是事务性的,这意味着要么两个操作都要继续,要么不是。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

当然可以做到!

ImageItem.withTransaction {status ->
   try {
      imageItem.delete(flush: true)
   } catch (Exception e) {
      status.setRollbackOnly()   
      return 
   }

   Path outFile = Paths.get(fileUrl)
   try{
      if (Files.deleteIfExists(outFile)) {
        log.debug "delete() - file deleted: ${fileUrl}"
      } catch (e) {
         status.setRollbackOnly()
      }
}

首先,您尝试删除数据库记录(如果失败则回滚),然后删除实际文件。

https://grails.github.io/grails-doc/latest/ref/Domain%20Classes/withTransaction.html

答案 1 :(得分:0)

这可以通过使用@Transactional注释标记此方法来完成。要回滚事务,您应该抛出运行时异常。因此,通过组织代码并在方法的最后创建文件删除逻辑,您可以确保在出现错误时回滚这两个操作。

@Transactional
 boolean delete(ImageItem imageItem) {
    boolean success = false
    String imageId = imageItem.id

    ...

   try{
      imageItem.delete(flush: true)
    } catch (Exception e) {

    }
    Path outFile = Paths.get(fileUrl)
    //@TODO:Throw Runtime exception in case of file deletion failure
    if (Files.deleteIfExists(outFile)) {
      log.debug "delete() - file deleted: ${fileUrl}"
      success = true
    }

    return success
  }