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