登录
首页 >  Golang >  Go问答

如何在使用 go-sqlmock 进行并发查询时避免竞态条件?

来源:stackoverflow

时间:2024-03-14 16:54:22 299浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《如何在使用 go-sqlmock 进行并发查询时避免竞态条件?》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

sqlmock需要按顺序匹配sql。但是如果我的代码中有并发查询,就像这样:

    condition1 := make(map[string]string)
    condition2 := make(map[string]string)

    var count int64
    var user User
    var task Task

    var wg sync.WaitGroup
    wg.Add(3)

    wgDone := make(chan interface{})
    errCh := make(chan error)

    go func(wg *sync.WaitGroup) {
        defer wg.Done()

        err := conn.Where(condition1).Find(&user).Error
        if err != nil {
            errCh <- err
        }
    }(&wg)

    go func(wg *sync.WaitGroup) {
        defer wg.Done()

        err := conn.Where(condition2).Find(&task).Error
        if err != nil {
            errCh <- err
        }
    }(&wg)

    go func(wg *sync.WaitGroup) {
        defer wg.Done()

        err := conn.Count(&count).Error
        if err != nil {
            errCh <- err
        }
    }(&wg)
    
    go func() {
        wg.Wait()
        close(wgDone)
    }()

    select {
    case err := <-errCh:
        return err
    case <-wgDone:
        break
    }
    
    ...

据说我们无法知道sql的执行顺序。所以不知道如何使用sqlmock来正确匹配sql。


解决方案


MatchExpectationsInOrder 方法针对这种情况禁用了按顺序检查。

本篇关于《如何在使用 go-sqlmock 进行并发查询时避免竞态条件?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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