Postgresql 事务在执行后保持pg_stat_活动状态
我对PostgreSQL和golang都是新手。我主要是想了解以下几点:Postgresql 事务在执行后保持pg_stat_活动状态,postgresql,go,gorp,Postgresql,Go,Gorp,我对PostgreSQL和golang都是新手。我主要是想了解以下几点: 为什么我需要Commit语句来关闭连接,而另外两个close调用没有做到这一点 同时,我也希望您能给我指点一下如何正确/错误地使用游标 在下面的函数中,我使用gorp创建一个游标,逐行查询我的Postgres DB,并将每一行写入一个writer函数: func(txn *gorp.Transaction, q string, params []interface{}, myWrit
- 为什么我需要Commit语句来关闭连接,而另外两个
调用没有做到这一点close
- 同时,我也希望您能给我指点一下如何正确/错误地使用游标
在下面的函数中,我使用
gorp
创建一个游标,逐行查询我的Postgres DB,并将每一行写入一个writer函数:
func(txn *gorp.Transaction,
q string,
params []interface{},
myWriter func([]byte, error)) {
cursor := "DECLARE GRABDATA NO SCROLL CURSOR FOR " + q
_, err := txn.Exec(cursor, params...)
if err != nil {
myWriter(nil, err)
return
}
rows, err := txn.Query("FETCH ALL in GRABDATA")
if err != nil {
myWriter(nil, err)
return
}
defer func() {
if _, err := txn.Exec("CLOSE GRABDATA"); err != nil {
fmt.Println("Error while closing cursor:", err)
}
if err = rows.Close(); err != nil {
fmt.Println("Error while closing rows:", err)
} else {
fmt.Println("\n\n\n Closed rows without error", "\n\n\n")
}
if err = txn.Commit(); err != nil {
fmt.Println("Error on commit:", err)
}
}()
pointers := make([]interface{}, len(cols))
container := make([]sql.NullString, len(cols))
values := make([]string, len(cols))
for i := range pointers {
pointers[i] = &container[i]
}
for rows.Next() {
if err = rows.Scan(pointers...); err != nil {
myWriter(nil, err)
return
}
stringLine := strings.Join(values, ",") + "\n"
myWriter([]byte(stringLine), nil)
}
}
在延迟
部分中,我最初只会关闭行
,但随后我看到pg_statu_activity
在空闲事务
状态下保持打开状态,并使用获取所有的抓取数据
查询
调用txn.Exec(“关闭”)
没有帮助。在那之后,我在事务中的空闲状态下进行了一次closegrabdata
查询
只有当我开始调用Commit()
时,连接才真正关闭。我想也许我需要调用Commit来执行事务上的任何操作,但如果是这样的话——为什么我没有调用它就得到了查询结果?您想要结束事务,而不是关闭声明的游标<代码>提交
完成。
-这就是为什么您看到结果而不提交
pg_stat_activity.state
值为:active
当您运行语句时(例如,begin transaction;
或fetch cursos
),在事务中空闲
当您当前未运行语句时,但事务仍处于开始状态,最后是idle
,运行end
或commit
后,事务结束。断开连接后,会话结束,并且在pg_stat_activity
中根本没有行…您希望结束事务,而不是关闭已声明的游标<代码>提交完成。
-这就是为什么您看到结果而不提交
pg_stat_activity.state
值为:active
当您运行语句时(例如,begin transaction;
或fetch cursos
),在事务中空闲
当您当前未运行语句时,但事务仍处于开始状态,最后是idle
,运行end
或commit
后,事务结束。断开连接后,会话结束,并且pg\u stat\u activity
中根本没有行…您要结束事务,而不是关闭已声明的游标或成员以检查行。错误您要结束事务,而不是关闭已声明的游标或成员以检查行。错误感谢您的说明。如果我commit
事务,是否仍应关闭声明的游标和行。close()
<默认情况下,code>不带挂起,因此如果您没有明确定义,否则-提交时光标将丢失,是的,感谢您的澄清。如果我commit
事务,是否仍应关闭声明的游标和行。close()
<默认情况下,“代码>不带保留”,所以如果您没有明确定义其他选项,则提交时光标将丢失,是的