gpt4 book ai didi

mysql - Golang数据库/SQL MYSQL 8数据库查询不一致

转载 作者:行者123 更新时间:2023-12-01 20:26:52 25 4
gpt4 key购买 nike

在结果集上进行某些事务后(例如,通过编辑一些行在mysqlworkbench),从mysql 8.0.19中选择行时发现奇怪的不一致。

(此功能供引用:https://golang.org/pkg/database/sql/#DB.Query)

换句话说,db.Query(SQL)返回我的结果集的旧状态(在编辑和提交之前)。

编辑前的MYSQL行:

105 admin
106 user1
107 user2
109 user3

编辑后的MYSQL行:
105 admin
106 user11
107 user22
109 user33

,但Golang db.Query(SQL)仍持续返回:
105 admin
106 user1
107 user2
109 user3
db.Query(SQL)是否需要提交以保持与当前数据库状态的一致性?因为在添加了 db.Begin()db.Commit()之后,它开始始终如一地工作。没有尝试过其他数据库,看起来不像是驱动程序问题或变量复制问题。来自JDBC有点奇怪。自动提交已禁用。

代码:
func FindAll(d *sql.DB) ([]*usermodel.User, error) {
const SQL = `SELECT * FROM users t ORDER BY 1`
//tx, _ := d.Begin()
rows, err := d.Query(SQL)
if err != nil {
return nil, err
}

defer func() {
err := rows.Close()
if err != nil {
log.Fatalln(err)
}
}()

l := make([]*usermodel.User, 0)
for rows.Next() {
t := usermodel.NewUser()
if err = rows.Scan(&t.UserId, &t.Username, &t.FullName, &t.PasswordHash, &t.Email, &t.ExpireDate,
&t.LastAuthDate, &t.StateId, &t.CreatedAt, &t.UpdatedAt); err != nil {
return nil, err
}
l = append(l, t)
}

if err = rows.Err(); err != nil {
return nil, err
}

//_ = tx.Commit()

return l, nil
}

最佳答案

这纯粹是关于MySQL MVCC(请参阅https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.htmlhttps://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html),而不是Go/DB驱动程序。

简而言之,如果启动一个事务,读取一些数据,然后另一个事务对其进行更改并提交,则可能会或可能不会看到结果,具体取决于在MySQL服务器上设置的事务隔离级别。

关于mysql - Golang数据库/SQL MYSQL 8数据库查询不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60607512/

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