我使用lib / pq中的PostgreSQL驱动程序注意到Go的数据库/ sql包中有一个奇怪的行为。基本上,如果我在同一个连接上构建事务时使用数据库连接进行查询,我会进入死锁并且程序阻塞(我需要手动重启数据库服务器以使其再次工作)。在下面的示例代码中,我会卡在select语句中,并且永远不会执行第二个insert语句(如果我删除了查询,代码将正常执行)。
tx, _ := connection.Begin()
tx.Exec(insert_statement)
rows, _ := connection.Query(select_statement)
rows.Close()
tx.Exec(insert_statement_2)
tx.Commit()
这是正常的吗?每次我想使用事务时,我应该创建一个新的数据库连接吗?
答案 0 :(得分:0)
如果select_statement碰巧引用了insert_statement写入的任何内容,则connection.Query函数不会在与tx.XXX函数相同的会话上执行,您可能会阻止它。
尝试使用tx.Query(select_statement)查看是否阻止。