2017-02-20 59 views
-1

我搜索的方式開始在特定的時間(爲了測試併發訪問)一FunctionTransaction,但我沒有找到一個明確的辦法,我在這裏找到PostgreSQL - make two transactions run at the same time ,在特定的時間內用linux執行腳本的東西,但是如果您使用的是Windows或其他操作系統,這並沒有什麼幫助。PostgreSQL的 - 在特定的時間開始事務

我創建了一個簡單的方法,但我不知道這是否有問題或不:

我創建佔據start-date,那麼這個功能我用pg_sleep(sleep_time)來阻止我的行動,直到時間的函數,所以這個想法很簡單:

sleep_time = start_date - current_date 

下面是函數:

CREATE OR REPLACE FUNCTION start__my_job_in_specific_time(start_time timestamp) RETURNS INTEGER AS $$ 
    BEGIN 
     PERFORM pg_sleep((select extract(epoch from (start_time - (SELECT CURRENT_TIMESTAMP))))); 
     -- now execute my actions 
     UPDATE sch_lock.table_concurente set max_value = max_value + 1 
     WHERE id = (SELECT id FROM sch_lock.table_concurente ORDER BY id DESC LIMIT 1); 
     RETURN (SELECT MAX(max_value) FROM sch_lock.table_concurente); 
    END; 
    $$ 
LANGUAGE plpgsql; 

-- start my function at 2017-02-20 12:03:30 
SELECT * FROM start__my_job_in_specific_time('2017-02-20 11:03:30'); 

這項工作很好,並在EXAC交易工作時間。

我的問題:是否有任何類似的方式在postgres比這更好。

+1

還有https://github.com/citusdata/pg_cron項目 –

回答

1

你可能會更好使用clock_timestamp()然後 - CURRENT_TIMESTAMP將返回事務開始的TS,無法正常運行的開始:

t=# begin; 
select pg_sleep(2); 
do 
$$ 
begin 
    raise info '%',concat('CURRENT_TIMESTAMP: ',CURRENT_TIMESTAMP,' realtime: ',clock_timestamp()); 
end; 
$$ 
; 

end; 
BEGIN 
pg_sleep 
---------- 

(1 row) 

INFO: CURRENT_TIMESTAMP: 2017-02-20 11:40:59.294505+00 realtime: 2017-02-20 11:41:01.295338+00 
DO 
COMMIT 
+0

謝謝@Vao Tsun您的回答 –

2
和PostgreSQL 9.6上,你可以 export and import database snapshots,它可以讓你有效地啓動兩個交易

在同一時刻。

雖然您必須將快照名稱從一個程序傳遞給另一個程序。

當然,如果第二個事務在第一個事務仍在運行時開始,那麼它纔有意義,因此除了您的方法外,還可以使用它。

+0

謝謝@Laurenz Albe for ur answer –

0

你應該能夠做一些非常類似於你在問題中鏈接的答案。只需使用操作系統中的任何調度機制來調度兩個psql命令即可同時執行。在Windows中,使用內置的任務計劃程序。

或者,如果你有能力,你可以創建一個簡單的應用程序,在單獨的連接和線程上執行命令。只需使用同步對象來同步命令執行。

相關問題