我有一个带有处理多个文件的方法的Grails服务。 每个文件都将被处理(插入n-domains),如果正确,它将被移动到文件夹“backup”中,如果出现问题(验证或域保存),它将被移动到文件夹“errors”中 如果文件错误(不丢失以前在数据库上处理的文件),我需要在文件正确和回滚时提交数据库更改
现在我在服务类上有@Transactional,但它提交或回滚所有数据
@Transactional
class DocumentoTrasportoService extends GenericService {
public void processFiles(String path){
def pathFile = new File(path)
pathFile.eachFile{
try {
processFile(it)
//I want to commit here
//move file to folder "backup"
} catch (Exception ex){
//I want to rollback here
//move file to folder "errors"
}
}
}
public void processFile(File file){
//read file
//do validations
//insert domains
}
}
建议?
答案 0 :(得分:1)
由于您需要对该服务中的交易进行更多编程和细粒度控制,因此我建议您先使用withTransaction。这样,您就可以在其自己的事务中执行每个文件,而不是将单个事务作为服务方法执行。
理论上你的代码看起来像这样:
class DocumentoTrasportoService extends GenericService {
public void processFiles(String path){
def pathFile = new File(path)
pathFile.eachFile{
MyDomainClass.withTransaction { status ->
try {
processFile(it)
//move file to folder "backup"
} catch (Exception ex){
//I want to rollback here
status.setRollbackOnly()
//move file to folder "errors"
}
} // end of transaction
}
}
public void processFile(File file){
//read file
//do validations
//insert domains
}
请注意,您只需设置回滚事务的状态。希望这会有所帮助。