gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:26:17 24 4
gpt4 key购买 nike

当我使用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com