首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang数据库/sql 8 db.Query不一致性

Golang数据库/sql 8 db.Query不一致性
EN

Stack Overflow用户
提问于 2020-03-09 19:57:09
回答 1查看 234关注 0票数 1

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

(供参考此函数:https://golang.org/pkg/database/sql/#DB.Query)

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

编辑前MYSQL行:

代码语言:javascript
复制
105 admin
106 user1
107 user2
109 user3

编辑后的MYSQL行:

代码语言:javascript
复制
105 admin
106 user11
107 user22
109 user33

但是Golang db.Query(SQL) 仍然不断地返回:

代码语言:javascript
复制
105 admin
106 user1
107 user2
109 user3

db.Query(SQL)是否要求保持与当前数据库状态的一致性?因为在我添加了db.Begin()db.Commit()之后,它就开始持续工作了。没有尝试过其他数据库,看起来不像驱动程序问题,也不像变量复制问题。来自JDBC的消息有点奇怪。自动提交已禁用。

守则:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-10 00:39:51

这纯粹是关于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服务器上设置的事务隔离级别。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60607512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档