mysql - Grails 立即提交事务中的对象

标签 mysql grails transactions

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

我正在考虑对这个特定的表使用 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 解决方案。如果需要任何其他信息,请告诉我。

最佳答案

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

或者

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

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

关于mysql - Grails 立即提交事务中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40081032/

相关文章:

php - 导出 .CSV 文件,如果我使用列名称导出它,它会告诉我它是 SYLK 格式

php - 交易不适用于子功能

python - 使用静态方法的GAE/P交易

PHP MySQL InnoDB 使用事务多次插入不同表失败

php/mysql 正确合并具有相同列的 2 个表

php - 需要重新格式化日期变量以匹配 mysql 中的日期函数

spring - grails:spring:resources.groovy - 使用和不使用 ref() 引用 bean 之间有什么区别

unit-testing - 如何使用 grails 在单元测试中模拟 springSecurityService

php - 如何克隆 mysql_result

grails - SpringSecurity重播登录Grails