Mysql Go SQL Exec不更改数据库中的值

Mysql Go SQL Exec不更改数据库中的值,mysql,go,percona,Mysql,Go,Percona,我编写了一个程序,使用LOAD data infle创建数据并将其加载到数据库中。加载数据部分工作正常,但之后我运行更新查询。update查询返回nil作为错误,并返回1行受影响(如预期)。但当我签入数据库时,值从未改变。当我在MySQL控制台中手动运行更新查询时,它工作正常。此外,没有锁定或“挂起”查询。代码如下: // Load data var loadDataCommand = fmt.Sprintf("set autocommit = 0; set foreign_key_checks

我编写了一个程序,使用
LOAD data infle
创建数据并将其加载到数据库中。加载数据部分工作正常,但之后我运行更新查询。update查询返回nil作为错误,并返回1行受影响(如预期)。但当我签入数据库时,值从未改变。当我在MySQL控制台中手动运行更新查询时,它工作正常。此外,没有锁定或“挂起”查询。代码如下:

// Load data
var loadDataCommand = fmt.Sprintf("set autocommit = 0; set foreign_key_checks = 0; set sql_log_bin = 0; LOAD DATA LOCAL INFILE '%s' INTO TABLE %s COLUMNS TERMINATED BY ',' IGNORE 1 LINES; commit; set autocommit = 1; set foreign_key_checks = 1; set sql_log_bin = 1;", filepath.Join(directoryName, tableName + ".txt"), tableName))
_, err := db.Exec(loadDataCommand)
if err != nil { panic(err) }


// Update table
_, err = db.Exec(fmt.Sprintf("UPDATE states.cities SET states.cities.online = %d WHERE states.cities.city_id = '%s'", status, cityId))
我设法“修复”这一问题的唯一方法是关闭并重新打开数据库连接。这就是我打开连接的方式

newDbConnection, err := sql.Open(DatabaseDriver, DatabaseUser+":"+DatabasePassword+"@tcp("+DatabaseAddress+":3306)/"+DatabaseName+"?multiStatements=true")

if err == nil {
    newDbConnection.SetMaxOpenConns(MaxNumberOfDatabaseConnections)
    newDbConnection.SetMaxIdleConns(MaxNumberOfDatabaseConnections)
    newDbConnection.SetConnMaxLifetime(MaxAgeOfDatabaseConnection)

    db = newDbConnection
}

另外,如果我在加载数据之前运行更新查询,它也可以正常工作。最奇怪的是,UPDATE查询返回正确的值(受影响的1行)和作为错误的nil…

在第一个
Exec
中,您设置了
autocommit=0
,因此您可能必须在
UPDATE
语句之后提交它?或者在第一条语句之后将自动提交设置回其原始值。我在加载数据之后将自动提交设置为原始值(autocommit=1)。我错过了。抱歉。关闭并重新打开您的连接修复了它,再加上您以
设置自动提交=0开始(不管是否将其重置为1),这让我非常怀疑。sql.Open不会返回连接。Go sql库在后台维护一个连接池。对db.Exec或db.Query等的每次调用都可以在不同的连接上运行。使用事务确保调用在同一数据库连接上。看见