2011-12-06 21 views
0

我想要一個計數器,我會在每次新交易開始時重置爲0。我希望在某些觸發器中使用該計數器的值。因爲postgres的臨時序列是會話本地的,所以只有在同一會話中沒有「並行」運行兩個事務的可能性時,我纔可以使用一個作爲我的計數器。在Postgres中安全嗎? (我想到的讓我感到不確定的情況就像Oracle中的自治事務一樣,在這種情況下,我的會話本地對象將被外部事務和內部自治事務共享,這會破壞我想要的對象的事務局部性)在postgres中,(錯誤)使用臨時(會話本地)序列作爲事務本地序列是否安全?

我知道我可以使用帶有ON COMMIT DROP或DELETE ROWS的TEMP表,但是我想知道一個臨時序列是否足夠,至少在postgres中。

+0

那麼你的問題到底是什麼? 「安全嗎?」不夠具體。你想實現什麼? –

+0

我想知道一個會話本地對象是否可以以任何可能的方式同時被多個事務同時訪問。我更詳細地描述了我的問題的背景。對不起,如果不清楚。 – Paralife

回答

2

當前PostgreSQL不支持並行或自主事務,因此session ==事務,因此會話本地臨時序列將一次只能由一個事務訪問。

您現在可以模擬Pg中的自治事務的唯一方法是使用dblink建立到數據庫的新連接。因爲這也建立了一個新的和獨立的會話,所以您無需擔心dblink的任何問題。

目前,它是安全的(如果我已經解釋了你想要的東西正確)。

從長遠來看,希望引入自治事務作爲真正的存儲過程支持的一部分。這看起來還有很長的路要走,而且不清楚自治事務是否能夠看到臨時表和由其父代創建的序列。您必須等待觀察,並準備好相應地調整您的方法,或許可以使用以當前事務標識(txid)命名的臨時序列。

如果你願意,你可以做到這一點;使用txid_current()函數獲取當前事務ID。

編輯:不,txid不會跨保存點更改。

regress=> begin; 
BEGIN 
regress=> SELECT txid_current(); 
txid_current 
-------------- 
     346947 
(1 row) 

regress=> savepoint test; 
SAVEPOINT 
regress=> SELECT txid_current(); 
txid_current 
-------------- 
     346947 
(1 row) 

雖然我想那是依靠一個實現細節。

+0

雖然如此,但我沒有這樣做,因爲我的印象是txid隨保存點而變化。這不是真的嗎? – Paralife

+0

@Paralife:另外,使用動態標識符操作很難使用列默認值或非動態SQL等功能。 –

+0

txid不會在保存點上發生變化 - 請參閱上文。如果你擔心這個問題,你可以從txid和CURRENT_TIMESTAMP中建立一個標識符(正如txn start所固定的那樣)。 [編輯:這是無稽之談; txid仍然會改變。如果兩個txns同時啓動到定時器分辨率,則不能使用_just_時間戳。啊。只要依靠txid不要改變,並測試升級!] 我不認爲這將是特別漂亮,但你可以包裝它在一個簡單的SQL函數,使它更容易使用的默認和非動態SQL,Erwin提到這是一個問題。 –

相關問題