在结果集中的一些事务之后(例如,通过编辑一些行在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 user3db.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
}发布于 2020-03-10 00:39:51
这纯粹是关于MySQL MVCC (参见https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html和https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html),而不是Go/DB驱动程序。
简而言之,如果您启动了一个事务,读取了一些数据,然后另一个事务对其进行了更改并提交,您可能会看到也可能不会看到结果,这取决于在MySQL服务器上设置的事务隔离级别。
https://stackoverflow.com/questions/60607512
复制相似问题