【Golang】gorm添加数据库排他锁,for update
适用于先读后更新的数据竞争场景,且应该将加锁操作放到事务中,防止锁被自动释放,原因参考mysql docsfunc UpdateUser(db *gorm.DB, id int64) error {tx := db.Begin()defer func() {if r := recover(); r != nil {tx.Roll...
·
适用于先读后更新的数据竞争场景,且应该将加锁操作放到事务中,防止锁被自动释放,原因参考mysql doc
func UpdateUser(db *gorm.DB, id int64) error {
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return err
}
user := User{}
// 锁住指定 id 的 User 记录
if err := tx.Set("gorm:query_option", "FOR UPDATE").First(&user, id).Error; err != nil {
tx.Rollback()
return err
}
// 更新操作...
// commit事务,释放锁
if err := tx.Commit().Error; err != nil {
return err
}
return nil
}
sync.Mutex
解法(效率较低):
var lock sync.Mutex
func UpdateUser(db *gorm.DB, id int64) error {
lock.Lock()
// 数据库操作...
lock.Unlock()
return nil
}
参考
更多推荐
已为社区贡献1条内容
所有评论(0)