我有以下方法,从文件系统中删除图像,并从数据库中删除相应的记录。
boolean delete(ImageItem imageItem) {
boolean success = false
String imageId = imageItem.id
...
Path outFile = Paths.get(fileUrl)
if (Files.deleteIfExists(outFile)) {
log.debug "delete() - file deleted: ${fileUrl}"
success = true
}
try{
imageItem.delete(flush: true)
} catch (Exception e) {
log.debug "delete() - Record deleted failed: ${e}"
success = false
}
return success
}
我想使这两个delete操作都是事务性的,这意味着这两个操作都在继续或不进行。
有办法这样做吗?
发布于 2015-07-03 09:43:43
你当然能做到!
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
发布于 2015-07-03 12:30:55
这可以通过使用@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
}
https://stackoverflow.com/questions/31211745
复制