Gorm-事务锁定(二)|资讯

腾讯云 2023-04-28 01:03:49


(资料图片仅供参考)

使用事务锁定避免死锁

在使用事务锁定时,需要注意避免死锁的发生。死锁是指两个或多个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方法提交事务。

x

热门推荐

航空市场逐渐回暖 机票均价环比涨幅明显

2022-06

海南推动农贸市场全面落实禁塑 加强违禁塑料制品源头治理

2021-12

柴犬登登拍卖记:动物是如何被司法拍卖的

2021-12

江西:到2025年鄱阳湖区断面水质优良比例达到50%以上

2021-12

西藏森林消防:锻造雪域救援尖兵 打造高海拔山岳救援队伍

2021-12

加强人才融通发展 第10届海峡两岸水利青年工程交流营成功举办

2021-12

四川:空手夺刀救人的“95后”女民警捐献万元奖金传递爱心

2021-12

中国食品名市临沂坚持“三化融合” 争做“食安”守望者

2021-12

上海闵行一幼儿园教职工殴打幼儿 2名涉事人员已被行拘

2021-12

受贿1414万元 江西万载县委原书记胡全顺获刑11年6个月

2021-12

推荐阅读

Gorm-事务锁定(二)|资讯

2023-04

广东省广告公司项目 广东省广告公司

2023-04

Canalys:2023年Q1中国手机出货降至6760万台 创十年新低 世界聚焦

2023-04

速读:买理财保险到底好不好呀安全吗知乎(买理财保险到底好不好呀安全吗知乎)

2023-04

深圳一季度固定资产投资增15%,投资万亿目标更近一步丨圳式开年“拼经济”

2023-04

通富微电:国家集成电路产业投资基金拟减持不超2%股份|微速讯

2023-04

最资讯丨南方传媒:一季度净利同比增37.03%

2023-04

联想公布新款小新 27 显示器:1080p 100Hz、4ms 响应时间|世界即时看

2023-04

焦点速看:等这条地铁亮相,沿线这些项目全部大翻身!

2023-04

银保监会发布《关于2023年加力提升小微企业金融服务质量的通知》

2023-04