gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:11:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com