Grails立即提交事务中的对象

时间:2016-10-17 07:49:46

标签: mysql grails transactions

在我的项目中有一个名为process_detail的表。一旦cron进程启动,就会在此表中插入行,并在结束时更新 cron进程完成。我们使用的grails在服务级别方法内部处理事务,即事务在方法开始时启动,如果方法执行成功则提交,如果有任何异常则回滚。 这里发生的事情是,如果事务失败,这一行也被回滚,我不想要,因为这是一个日志的类型 表。我尝试创建一个嵌套事务并保存此行,最后更新它,但失败时锁定获取异常。

我正在考虑将MyISAM用于此特定表, 这样我就不用担心交易了,因为MyISAM不支持它,它会立即提交,不可能回滚。这是我想要实现的伪代码。

def someProcess(){
  //Transaction starts
  saveProcessDetail(details); //Commit this immediately, should not rollback if below code fails.
  someOtherWork;
  updateProcessDetail(details); //Commit this immediately, should
  //Transaction Ends
}

用于保存和更新流程详细信息的伪代码;

def saveProcessDetail(processName, processStatus){
  ProcessDetail pd = new ProcessDetail(processName, processStatus);
  pd.save();
}

def updateProcessDetail(processDetail, processStatus){
  pd.procesStatus = processStatus;
  pd.save();
}

如果在InnoDB中做得更好,请提供建议。答案可能是mysql级别我可以找到我自己的grails解决方案。如果需要任何其他信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

制作someProcess @NonTransactional,然后自己管理事务性质。用flush:true编写初始的saveProcessDetail,然后使用事务处理来处理事务的剩余部分吗?

或者

@NonTransactional 
def someProcess() {
    saveProcessDetail(details) // I'd still use a flush:true
    transactionalProcessWork()
}

@Transactional
def transactionalProcessWork() {
    someOtherWork()
    updateProcessDetail(details)
}