我打算使用postgres LISTEN/NOTIFY aproach獲取表中記錄的插入時間(實際的事務提交時間)。爲了達到這個目的,我打算做以下事情。我在插入時發出通知,如下所示。Postgres LISTEN/NOTIFY - 低延遲,實時?
BEGIN;
INSERT INTO table_name(id, ...) values (id,....);
select pg_notify('test_channel', 'id - ' || id || ' trans start time - ' || now() || ' notify start time - ' || clock_timestamp());
END;
然後我打算使用https://pythonhosted.org/psycopg2/advanced.html#asynchronous-notifications來接收這些通知。
我想找出是確切的時間事務提交發生(該記錄可讀取)下降到微secods
據我所知,NOTIFY(pg_notify)實際上之後提交的發送通知該交易,但我無法弄清楚如何找出發生的確切時間。我在NOTIFY中使用的時鐘時間戳值不是實際的事務提交時間。
我猜我聽通知的時間將接近事務提交時間,但我不確定它有多接近。首先,在我的代碼中進行民意調查的時候,有一段時間是在聽(其實它很小),其次,我不確定NOTIFY/LISTEN通信本身之間是否存在任何延遲。
任何想法?
UPDATE(問題完整說明):我們有一個讀者在使用「檢查點」時,每個批次一個批次最後的時間戳之後獲得的行批次選擇行,而我們缺少的行。 (原因:時間戳值基於INSERT發生的時間(00.00.00)。在重負載下,如果事務需要更長的時間,比如插入10秒(00.00.10),讀者將錯過這一行(row1),如果它在10秒鐘內讀取並發現一個行的INSERT時間晚於(row。1)的時間(00.00.05),則該問題的完整描述與此博客中寫入的行爲類似。http://blog.thefourthparty.com/stopping-time-in-postgresql/)
呃...爲什麼?你想用這個做什麼?你試圖解決這個問題的根本問題是什麼,你需要它的原因是什麼? –
我更新了我們試圖在說明中解決的問題。 – Chandra
所以你只是試圖實現一個可靠的隊列與多個作家和一個閱讀器?試圖用這種方法修復亂序提交和可見性問題是行不通的。考慮在實際的底層主題上發佈一個新的單獨問題,即當隊列讀取器掃描表時,如何避免丟失行,然後在讀取後正在進行的事務提交。你很早就忽略了我的問題令人沮喪。 –