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