gorm 对于计数查询随机返回 nil

问题描述 投票:0回答:1

出于分页目的,我们有两个查询同时运行,主查询获取项目(限制页面大小),另一个查询在 goroutine 中运行,该 goroutine 查询满足条件的项目总数(可能超过一个)页)。问题是我们从计数查询中随机得到零返回。 SQL 计数查询永远不应该返回 nil,对吧?此外,当问题发生时,如果我手动从另一个客户端重新运行相同的计数查询,我可以正确获得计数。因此,当返回 nil 时,有些事情就不对劲了。计数查询如下所示,“row”变量偶尔返回 nil。我们可以检查 nil 以避免崩溃,但我想知道它什么时候会返回 nil 进行计数。顺便说一句,主查询和计数查询都非常复杂,包括使用递归子句构建树结构(不确定这是否与 nil 返回有任何关系)。

go func() {
    var rowCount int
    row := db.Raw(countSQL, args...).Row()
    err = row.Scan(&rowCount)

Gorm 对于 goroutine 应该是线程安全的。我想知道还有什么可能导致这种情况。从表面上看,这确实像是赛车状况。任何帮助将不胜感激。谢谢!

concurrency null thread-safety grails-orm
1个回答
0
投票

问题是由于同一 Gorm 会话的并发查询造成的。在 goroutine 中使用新会话后,问题就消失了。

row := db.Session(&gorm.Session{}).Raw(countSQL, args...).Row()
© www.soinside.com 2019 - 2024. All rights reserved.