Grails显式事务

时间:2014-05-13 10:59:54

标签: grails transactions

我有一个带有处理多个文件的方法的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
  }

}

建议?

1 个答案:

答案 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
  }

请注意,您只需设置回滚事务的状态。希望这会有所帮助。