Grails显式事务
我有一个Grails服务,它有一个处理多个文件的方法。 将处理每个文件(插入n个域),如果正确,将移动到“备份”文件夹中,如果出现问题(验证或域保存),将移动到“错误”文件夹中 我需要提交对文件正确的数据库更改,并在文件错误时回滚(不丢失数据库上处理的以前的文件) 现在我在服务类上有@Transactional,但它提交或回滚所有数据Grails显式事务,grails,transactions,Grails,Transactions,我有一个Grails服务,它有一个处理多个文件的方法。 将处理每个文件(插入n个域),如果正确,将移动到“备份”文件夹中,如果出现问题(验证或域保存),将移动到“错误”文件夹中 我需要提交对文件正确的数据库更改,并在文件错误时回滚(不丢失数据库上处理的以前的文件) 现在我在服务类上有@Transactional,但它提交或回滚所有数据 @Transactional class DocumentoTrasportoService extends GenericService { public
@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
}
}
建议?既然您需要对该服务中的事务进行更多的编程和细粒度控制,我建议您改为使用。通过这种方式,您可以在其自己的事务中执行每个文件,而不是将单个事务作为服务方法来执行 理论上,您的代码应该是这样的:
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
}
请注意,您只需要设置回滚事务的状态。希望这能有所帮助。即使我必须在多个域上插入?是的。即使您在withTransaction闭包中插入多个域,它们都将位于同一事务中。Maght以及在服务本身上设置static transactional=false也没有意义在您的服务的顶层产生开销。但是如果I static transactional=false并且在插入一些数据后文件进程失败。。。假设您正在谈论将文件移动到“备份”时出现故障,则将保留此数据。因为这在withTransaction闭包中,所以任何异常都会导致事务回滚,因为catch和设置setRollbackOnly()。因此,唯一受影响的数据将是为该文件插入/更新的数据。不是其他文件或所有文件。