gpt4 book ai didi

MYSQL并发选择和更新

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:13 24 4
gpt4 key购买 nike

我无法理解如何使用多个 goroutine 选择然后更新表。在 db 和 stmt 的文档中它说:“多个 goroutines 并发使用是安全的。”我也使用交易但没有成功。我想启动 7 个 goroutines 并获取每一行。

数据

+--------+-----------+---------------------+
| idTest | someValue | date |
+--------+-----------+---------------------+
| 1 | 1 | 2019-06-11 11:29:42 |
| 2 | 2 | 2019-06-11 11:29:42 |
| 3 | 3 | NULL |
| 4 | 4 | NULL |
| 5 | 5 | NULL |
| 6 | 6 | NULL |
| 7 | 7 | NULL |
+--------+-----------+---------------------+

当前代码

db, err := sql.Open("mysql", strConn)
if err != nil {
fmt.Printf("Troubles in connaction! %s", err)
}

var idTest int
var someValue string

stmt, err := db.Prepare("select idTest,someValue from test where date is null limit 1")
CheckError(err)

defer stmt.Close()

rows, err := stmt.Query()
CheckError(err)

defer rows.Close()

for rows.Next() {
rows.Scan(&idTest, &someValue)

stmt, err = db.Prepare("update test set date = now() where idTest= ?")
CheckError(err)
_, err = stmt.Exec(idTest)
CheckError(err)
}

每个 goroutine 都有 db.conn,有时会尝试选择和更新表。

func main() {
for i := 0; i < 7; i++ {
dbConn := "blabla"
go ChildBot(dbConn)
}
var input string
fmt.Scanln(&input)
}

最佳答案

你应该读取数据然后运行一个 goroutine。

for rows.Next() {
rows.Scan(&idTest, &someValue)
go func(idTest int) {
stmt, err = db.Prepare("update test set date = now() where idTest= ?")
CheckError(err)
_, err = stmt.Exec(idTest)
CheckError(err)
}(idTest)
}

这样做是因为您必须先读取数据,然后再对其进行任何操作。否则,下一次阅读可能会不时覆盖您之前的值。

关于MYSQL并发选择和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56540212/

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