mysql - golang中查询mysql时发生死锁错误,不是在查询段中而是在out of "rows.Next()"循环之后

标签 mysql go deadlock

当我使用golang查询mysql时,有时我会在代码中发现“deadlock err”。

我的问题不是“为什么会发生死锁”,而是为什么在“err = rows.Err()”中发现死锁错误。在我看来,如果发生死锁,我应该在“tx.Query”的返回错误处得到它。

这是演示代码,“点2”是发生死锁错误的地方


func demoFunc(tx *sql.Tx, arg1, arg2 int) ([]outItem, error) {
    var ret []outItem
    var err error
    var rows *sql.Rows

    //xxxLockSql may deadlock, so try again for 3-times
    for i := 0; i < 3; i++ {
        //------ point 1
        rows, err = tx.Query(xxxLockSql, arg1, arg2)
        if err == nil {
            break
        }

        log.Printf("[ERROR] xxxLockSql failed, err %s, retry %d", err.Error(), i)
        time.Sleep(time.Millisecond * 10)
    }

    //if query xxxLockSql failed up to 3-times, then return
    if err != nil {
        log.Printf("[ERROR] xxxLockSql failed, err %s", err.Error())
        return ret, err
    }

    defer rows.Close()

    for rows.Next() {
        err = rows.Scan(&a1, &a2)
        if err != nil {
            return ret, err
        }

        ret = append(ret, acl)
    }

    //------ point 2
    if err = rows.Err(); err != nil {
        // i found deadlock err in this "if" segment.
        // err content is "Error 1213: Deadlock found when trying to get lock; try restarting transaction" 
        log.Printf("[ERROR] loop rows failed, err %s", err.Error())
        return ret, err
    }

    return ret, nil
}

最佳答案

我无法确定原因,因为您没有提到您的数据库驱动程序(以及您正在使用哪个 sql 包)。但我认为这是因为 sql.Query 是惰性的,这意味着查询和加载行被推迟到实际使用,即 rows.Next() - 这就是为什么那里发生死锁错误。

之所以跳出循环,是因为当发生错误时,rows.Next() 返回 false 并中断循环。

关于mysql - golang中查询mysql时发生死锁错误,不是在查询段中而是在out of "rows.Next()"循环之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59206306/

相关文章:

javascript - 如何用我要编辑的html表中行的数据填充表单中的输入字段

python - 将 MySQL 数据库迁移到 Django 时出错。意外的主机名

dictionary - 如何在 Golang 中锁定特定 map 的索引以进行并发读/写

python - 大量的multiprocessing.Process导致死锁

.net - 终止 .NET 4 TPL 中的死锁任务

mysql - 如何在预定时间后执行MySQL中的任务

php - foreach 循环用于 bool 模式下的全文搜索

mongodb - Golang/MGO—— panic : no reachable servers

go - 如何应用 kubernetes 工作负载

deadlock - 并发处理-Petersons算法