在我的项目中有一个名为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/