18910140161

从GORM里学习到的panic处理方式

顺晟科技

2021-06-16 10:27:37

416

今天在博客的评论里,有童鞋提醒我,GORM里也有简化事务处理的帮助函数。源码如下:

//事务启动一个事务作为一个块,返回错误将回滚,否则提交。

函数(数据库*数据库)事务(函数(发送*数据库)错误,选择.*sql .TxOptions()错误错误){

恐慌:=真

如果是提交器,ok :=db。声明。康普尔。(TxCommitter);ok committer!=零{

//嵌套事务

db .保存点(fmt .Sprintf('sp%p ',fc))

delay func(){

//确保在死机、阻塞错误或提交错误时回滚

如果惊慌失措||呃!=零{

db .回滚到(fmt .Sprintf('sp%p ',fc))

}

}()

err=fc(db .会话(会话{WithConditions: true}))

} else {

tx :=db .开始(选项.)

delay func(){

//确保在死机、阻塞错误或提交错误时回滚

如果惊慌失措||呃!=零{

德克萨斯州.回滚()

}

}()

err=fc(tx)

if err==nil {

err=tx .提交()。错误

}

}

恐慌=假

返回

}

思路和我的差不多。

有两个不同,,在获取了委托人的时候,会优先选择使用保存点这个特性,相当于事务里的子事务。

第二,处理恐慌的方式,这一点值得学习。首先在函数的入口处设置变量:惊慌失措:=真,在推迟函数中判断是否恐慌了,从而进行相应处理:

delay func(){

//确保在死机、阻塞错误或提交错误时回滚

如果惊慌失措||呃!=零{

db .回滚到(fmt .Sprintf('sp%p ',fc))

}

}()

那么什么情况下,不会执行呢?当然就是执行到最后的时候,执行了恐慌=假这一行代码之后。

这样就成功避免了使用恢复来判断是否发生了异常。不过也因此,无法在这一层捕捉恐慌了。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航