2016-06-11 65 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