Grails显式事务

Grails显式事务,grails,transactions,Grails,Transactions,我有一个Grails服务,它有一个处理多个文件的方法。 将处理每个文件(插入n个域),如果正确,将移动到“备份”文件夹中,如果出现问题(验证或域保存),将移动到“错误”文件夹中 我需要提交对文件正确的数据库更改,并在文件错误时回滚(不丢失数据库上处理的以前的文件) 现在我在服务类上有@Transactional,但它提交或回滚所有数据 @Transactional class DocumentoTrasportoService extends GenericService { public

我有一个Grails服务,它有一个处理多个文件的方法。 将处理每个文件(插入n个域),如果正确,将移动到“备份”文件夹中,如果出现问题(验证或域保存),将移动到“错误”文件夹中 我需要提交对文件正确的数据库更改,并在文件错误时回滚(不丢失数据库上处理的以前的文件)

现在我在服务类上有@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
  }

}

建议?

既然您需要对该服务中的事务进行更多的编程和细粒度控制,我建议您改为使用。通过这种方式,您可以在其自己的事务中执行每个文件,而不是将单个事务作为服务方法来执行

理论上,您的代码应该是这样的:

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()。因此,唯一受影响的数据将是为该文件插入/更新的数据。不是其他文件或所有文件。