2016-06-11 82 views
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() 

这是正常的吗?每次我想使用事务时,我应该创建一个新的数据库连接吗?

回答

0

如果select_statement中恰好引用被insert_statement写的任何东西的connection.Query功能并不在同一个会话的tx.XXX functionsso执行,你可能会阻止。

尝试tx.Query(select_statement中),看看是否能一个块。

+0

是,tx.Query()会的工作,但我不能总是控制这一点。事务tx用于管理员对数据库进行一些更新,而查询则由访问该网站的用户调用。所以这两件事可能同时发生,我宁愿它不关闭我的数据库! – splinter123

+0

我只希望在同一个goroutine中背靠背执行时出现死锁。当不同的例程执行不同的事情时,你会遇到这个问题吗?另外,postgresql SELECT语句不会锁定,除非您执行“更新”,您是否这样做? –

+0

我没有测试它在不同的够程,我试图复制天真地由同一个线程上做不同的事情并发行为,但也许它不是去的好办法。 select语句只是一个普通的“select * from mytable”,其中相同的“mytable”由前一个插入修改。 – splinter123