问题描述
我需要使用新转换的ID(作为“记录”传递)更新一个相当大的psql表。我在下面创建了此功能以利用pgxpool的连接池并请求批处理,如果我使用其他客户端应用这些事务,它们将更新数据库,如果我查看打印出的结果,它们表明每次1行都受到影响,但是当我从数据库中检索这些行,它们保持不变。我是否以某种方式错误地使用了批处理?
B
打印输出:
B.bar()
解决方法
根据@Adrian Klaver的建议,我进行了以下更改以完成交易:
-
仍然需要明确地执行交易
-
在SendBatch之后,事务连接将保持打开状态。在使用connetion进行提交之前,可能需要释放它们。
以下是更改后的代码:
import (
...
"github.com/jackc/pgconn"
"github.com/jackc/pgx/v4"
"github.com/jackc/pgx/v4/pgxpool"
log "github.com/sirupsen/logrus"
)
func SetNewSubscriptionValuesBatch(dsn string,records map[string]string) error {
ctx := context.Background()
var db *pgxpool.Pool
db,err := pgxpool.Connect(ctx,dsn)
defer db.Close()
if err != nil {
panic(err)
}
tx,err := db.Begin(ctx)
if err != nil {
panic(err)
}
b := &pgx.Batch{}
for id,subID := range records {
sqlStatement := `
UPDATE event
SET subscription_id_2 = $2
WHERE id = $1;`
b.Queue(sqlStatement,id,subID)
}
batchResults := tx.SendBatch(ctx,b)
var qerr error
var rows pgx.Rows
for qerr == nil {
rows,qerr = batchResults.Query()
rows.Close()
}
return tx.Commit(ctx)
}