2014-02-11 33 views
1

我在pg_stat_activity找到了一個當前爲<IDLE> in transaction的查詢。在後臺交易查詢中提交空閒

如果我叫pg_cancel_backend此查詢的procpid,事務將被回滾。我對嗎?

如何從我的DB控制檯發出一個commit命令來交易?

有沒有pg_commit_backend(procpid)或類似的東西?

想提交的原因是,我不能追查這個查詢是,它從一個bug的代碼可能是。然而,我不能退縮,因爲這會導致交易在閒置之前完成的損失。從後端提交以便查詢可以釋放它的鎖並且可以繼續進行其他等待查詢將是有用的。

+0

我還沒有在DBA SE中的帳戶。我通常在SO中提出關於數據庫的問題。這是我第一次進行移民投票。 – ADTC

+1

必須假定一個半成品交易可能包含不連貫的數據。如果客戶沒有意識到這違背了交易的概念,則強行進行提交。 –

回答

4

您不能在運行後端之外提交事務。您需要追蹤並修復錯誤代碼。無法在運行會話之外強制進行提交。

pg_terminate_backend將正確回滾事務。同樣,pg_cancel_backend將取消一個正在運行的查詢,並在該過程中將事務回滾。

如果你不知道什麼是交易做了,或者它就是舞臺上到這你就錯了反正提交。你不知道它是否通過了一些工作,即使它閒置了一段時間。好吧,如果你真的絕望了,你可以用gdb注入一個commit命令,通過用調試器附加到後端。這是有風險的,真的是一次性的絕望行爲,常規或自動執行並不是很理智,並且不適合您的情況,看起來您的代碼經常會在事務處理中閒置會話。

你登錄一個有用的log_line_prefix你所有的疑問?如果是這樣,你可以從日誌中重建它們。

desparation的另一個選擇是使用pg_dirtyread或類似的工具,以讀未提交/回滾數據。你會看到刪除的數據,這是舊版本的update d行等數據,所以有一堆排序通過做。

+0

很傷心,你說得對。 – ADTC

+0

@ADTC希望您的應用程序的設計能夠讓他們保存信息,直到他們得到確認的提交。如果沒有,請參閱編輯 - 如果真的很重要,可以通過覆蓋MVCC並使用附加工具對錶格進行髒讀來恢復堆中的數據。 –

+0

這很好理解。無論如何,我們決定終止交易並繼續前進。 – ADTC