登录
首页 >  Golang >  Go问答

psql 上的乐观锁为何未能有效控制并发访问?

来源:stackoverflow

时间:2024-02-23 12:06:25 321浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《psql 上的乐观锁为何未能有效控制并发访问?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我正在尝试获取并更新列,并且需要此过程是并发的。因此,我通过 select for updateand 执行行级锁定,然后进行计算,然后进行更新,所有这些都在具有隔离级别 repeatable read 的事务内进行。但是,这仍然没有按预期并发。该列只是一个随机列,不是主键或外键。

之后我将其更改为乐观锁定并且有效,但我试图理解为什么这不起作用。我多次同时运行下面的代码,但它的行为方式与我单独运行它相同次数时的行为方式不同。

_, err = s.xstore.managetransaction(func(ctx context.context, tx *sqlx.tx) (interface{}, error) {
                _, err := tx.exec("set transaction isolation level repeatable read")
                if err != nil {
                    return nil, err
                }
                c, err = s.xstore.getforupdate(x) 
                //some calculations
                _ = s.xstore.update(c)
                return nil, nil
            })
            return
    }()
}

这是我的 get 查询,其中使用 for update 来锁定该行。

func (s *xStore) GetForUpdate(id string) (*model.X, error) {
    query := `
        SELECT * FROM things where id = $1 FOR UPDATE`

    _, err := s.db.Exec(query, id)
    if err != nil {
        return nil, err
    }

    var x model.X
    err := s.db.Get(&x, query, id)
    err = s.db.Get(&x, query, id)
    if err != nil {
        return nil, err
    }
    return &x, nil
}

正确答案


您的代码正在不同的事务中执行查询, 创建新的(db.BeginTx)或使用提供的某种方式,例如:

  • rows := tx.Query( 您的查询 )
  • 做一些计算
  • tx.ExecContext
  • tx.Commit

(参考https://go.dev/doc/database/execute-transactions

终于介绍完啦!小伙伴们,这篇关于《psql 上的乐观锁为何未能有效控制并发访问?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>