我有以下方法从文件系统中删除图像及其相应的记录。
Response.AddCacheDependency(new CacheDependency(filename));
我想让两个删除操作都是事务性的,这意味着要么两个操作都要继续,要么不是。
有没有办法做到这一点?
答案 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
}