2016-11-08 31 views
0

我需要使用多個連接併發地在Postgres中填充表,但在單個事務的範圍內。可能嗎?Postgres中每個事務可能有多個連接嗎? Golang的用法

我看不出有什麼辦法可以避免這個瓶頸。

謝謝

+0

我不認爲是可能通過不同的連接共享交易。請更好地解釋你想做什麼,也許增加一個例子,以便於理解。 –

+0

我有一個golang命令,用於分析一組csv文件並在數據庫中填充相應的表。這些文件非常大。解析器逐行讀取文件並將它們放入通道。四個goroutines從一個通道獲取這些結果並生成Exec()。如果我做db.Exec()整個過程需要25分鐘,如果tx.Exec()超過4小時。 – MasterJ

+0

此外,我無法在不同的事務中執行不同的文件,因爲處理當前文件必須看到以前文件所做的更改。 (Postgres不支持READ UNCOMMITED)作爲整個過程的結果,我只能使用一個連接。 – MasterJ

回答

0

我相信交易不需要。

但是,如果多想 - 你可以做一個臨時表,有幾個程序填充它,然後在交易通過使用這樣的傳輸大量數據「從選擇插入」

+0

謝謝。我也想過了。但爲什麼你認爲這個交易不需要? 按要求如果進程在某一點失敗,我們應該得到數據庫在以前的條件。 – MasterJ

+0

我假定您對下載的數據執行必要的檢查不在業務邏輯層或階段表中,然後在事務之外加載它們。 在任何情況下,大量數據的長時間運行事務都會導致性能DBMS的降級。 –

+0

你可以嘗試玩水平的絕緣。 1.選擇所需的連接數(線程數)。將它們設置爲隔離級別「閱讀未提交」[link](https://www.postgresql.org/docs/9.6/static/transaction-iso.html)以查看其他主題中所做的更改 2.在每個他們開始一個事務 3.當線程完成加載數據時,它必須等待其他事務並且沒有提交事務 4.當所有線程完成時 - 在所有線程上執行提交。 在所有線程的線程回滾更改之一出現SQL錯誤的情況下。 –

相關問題