Gorm-事务锁定(二)


(相关资料图)

使用事务锁定避免死锁

在使用事务锁定时,需要注意避免死锁的发生。死锁是指两个或多个goroutine在等待对方释放锁定资源的情况下,陷入了一种互相等待的状态。为了避免死锁的发生,我们应该在进行事务锁定时,按照一定的顺序对数据进行加锁。

下面是一个使用事务锁定避免死锁的示例:

package mainimport (    "fmt"    "gorm.io/driver/mysql"    "gorm.io/gorm")type Account struct {    ID      uint    Balance float64}func main() {    dsn := "user:password@tcp(host:port)/database"    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})    if err != nil {        panic(err)    }    defer db.Close()    tx := db.Begin()    defer func() {        if r := recover(); r != nil {            tx.Rollback()        }    }()    var account1, account2 Account    if err := tx.Set("gorm:query_option", "FOR UPDATE").Where("id = ?", 1).First(&account1).Error; err != nil {        tx.Rollback()        panic(err)    }    if err := tx.Set("gorm:query_option", "FOR UPDATE").Where("id = ?", 2).First(&account2).Error; err != nil {        tx.Rollback()        panic(err)    }    if account1.Balance < 100.00 {        tx.Rollback()        panic("insufficient balance")    }    account1.Balance -= 100.00    if err := tx.Save(&account1).Error; err != nil {        tx.Rollback()        panic(err)    }    account2.Balance += 100.00    if err := tx.Save(&account2).Error; err != nil {        tx.Rollback()        panic(err)    }    tx.Commit()}

在这个示例中,我们定义了一个Account结构体,表示账户信息。我们使用Set方法设置查询选项,并使用Where方法查询id为1和2的账户信息,并将查询结果存储在变量account1account2中。

我们按照id的大小对两个账户进行加锁,这样可以避免两个goroutine对同一组数据进行加锁,从而避免死锁的发生。接下来,我们检查账户1的余额是否足够,如果不足,则进行回滚操作。

然后,我们分别将账户1的余额减去100元,账户2的余额加上100元,并使用Save方法将修改后的账户信息写入数据库。

最后,我们使用Commit方法提交事务。

标签:

最近更新

Gorm-事务锁定(二)
2023-04-28 01:10:45
低gi食物一览表大全 低gi食物一览表 世界快报
2023-04-27 23:14:58
AWE2023橙色云发布扫拖机器人i2及两款个护产品
2023-04-27 22:18:17
当前最新:纬湃科技:将电气化进行到底
2023-04-27 21:55:16
当前时讯:江苏徐州大沙河畔林下种植羊肚菌 “沙土窝”蝶变“致富湾”
2023-04-27 21:01:55
深圳一季度贷款8.9万亿增逾10%,投向制造业、普惠小微、外贸大幅增长丨圳式开年“拼经济”
2023-04-27 20:30:11
全球要闻:浙江机场“五一”假期预计运送旅客超百万人次
2023-04-27 19:49:13
上游晴雨表|五一假期先晴后雨,最高气温不超过30℃ 世界简讯
2023-04-27 19:02:30
win11怎么看电脑温度_怎么看电脑温度_每日视点
2023-04-27 18:55:01
海泰科: 关于2022年度利润分配及资本公积金转增股本预案的公告 全球热点评
2023-04-27 18:32:29
起亚一季度全球销量同比增长12% 电动汽车销量增幅达21.1%
2023-04-27 17:57:41
天天资讯:多晶硅价格缓跌不止 光伏组件厂商一季度业绩集体“开门红”
2023-04-27 17:31:22
全球热讯:坐拥10万网红,无忧传媒困于秀场难进卖场
2023-04-27 17:14:22
新华社权威快报丨一季度全国新设民营企业203.9万户 同比增长10.7% 全球快报
2023-04-27 16:38:05
观天下!经济的巨人超大型巨人是谁_经济的巨人3
2023-04-27 16:05:52
热门:乔瓦尼之岛_乔瓦尼
2023-04-27 15:41:22
每日信息:中小板创业板上市需要什么条件?中小板上市和创业板上市哪个比较难
2023-04-27 15:23:12
天天通讯!省政府召开常务会议 研究加强招商引资等工作
2023-04-27 14:52:35
CBA季后赛:辽宁本钢胜浙江东阳光
2023-04-27 14:13:54
供销社概念尾盘拉升,天鹅股份涨停|今日看点
2023-04-27 14:01:41
新疆吐峪沟:千年古村初显时代新貌 焦点报道
2023-04-27 13:24:49
全球快播:裸眼3D、全息影像等技术精彩亮相第十三届中国卫星导航年会顺义展区
2023-04-27 12:46:00
世界速递!国家非特殊化妆品备案平台_国家非特殊化妆品备案
2023-04-27 12:01:34
开封市尉氏县朱曲镇开展消防安全教育“进校园”活动
2023-04-27 11:25:51
最新资讯:山西提升病原体高通量基因测序和分析能力
2023-04-27 11:14:29
粮价稳不稳 关键看生产|环球快消息
2023-04-27 10:44:21
天天通讯!交城县:努力打造氢能产业发展“交城样板”
2023-04-27 10:19:28
冬奥会跟奥运会的区别_冬奥会跟奥运会有什么区别|天天观天下
2023-04-27 10:06:26
五省一季度新增发债超千亿 专项债发行提速稳经济_速讯
2023-04-27 09:23:00
科目三考试内容及合格标准最新_科目三考试内容及合格标准-全球焦点
2023-04-27 09:24:05