1
我注意到在Go的数据库/ SQL包一个奇怪的行为,从使用的lib/PQ PostgreSQL驱动。基本上,如果我在同一连接上构建事务时使用数据库连接进行查询,则会进入死锁并且程序块(我需要手动重新启动数据库服务器以使其再次工作)。在下面的示例代码中,我会卡住select语句,并且第二个insert语句永远不会被执行(而如果我删除查询,则代码正常执行)。死锁在golang数据库/ SQL
tx, _ := connection.Begin()
tx.Exec(insert_statement)
rows, _ := connection.Query(select_statement)
rows.Close()
tx.Exec(insert_statement_2)
tx.Commit()
这是正常的吗?每次我想使用事务时,我应该创建一个新的数据库连接吗?
是,tx.Query()会的工作,但我不能总是控制这一点。事务tx用于管理员对数据库进行一些更新,而查询则由访问该网站的用户调用。所以这两件事可能同时发生,我宁愿它不关闭我的数据库! – splinter123
我只希望在同一个goroutine中背靠背执行时出现死锁。当不同的例程执行不同的事情时,你会遇到这个问题吗?另外,postgresql SELECT语句不会锁定,除非您执行“更新”,您是否这样做? –
我没有测试它在不同的够程,我试图复制天真地由同一个线程上做不同的事情并发行为,但也许它不是去的好办法。 select语句只是一个普通的“select * from mytable”,其中相同的“mytable”由前一个插入修改。 – splinter123