【问题标题】:Grails Immediate commit for objects in a transactionGrails 立即提交事务中的对象
【发布时间】:2017-02-26 02:54:31
【问题描述】:

在我的项目中有一个名为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 解决方案。如果需要任何其他信息,请告诉我。

【问题讨论】:

  • 您需要显示saveProcessDetail() 方法,以便我们提出建议。
  • @AdeelAnsari :补充说,我已将它们用作方法,它们也可能只是创建 ProcessDetail 对象并保存它的两行代码。

标签: mysql grails transactions


【解决方案1】:

创建 someProcess @NonTransactional,然后自己管理事务性质。使用flush:true 编写初始saveProcessDetail,然后使用Transaction 将处理的其余部分设为事务性?

或者

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

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

【讨论】:

  • 这看起来可行。我会试一试的。
  • 使用 flush true 不是一个好习惯,因为您正在中断事务。我会尝试没有它
  • @quindimildev,你没有破坏它,你正在完成它。
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2013-10-24
相关资源
最近更新 更多