我寻找一种在特定时间内启动Function
或Transaction
的方法(为了测试并发访问),但我找不到一个明确的方法,我在这里找到PostgreSQL - make two transactions run at the same time,在特定时间用linux执行脚本的东西,但如果您使用的是Windows或其他操作系统,这没有用。
我创建了一个简单的方法,但我不确定这是否有问题:
我创建了一个接受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');
这项工作很好,交易工作在准确的时间。
我的问题:在postgres中有没有比这更好的方法。
你可能最好使用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
从PostgreSQL 9.6开始,您可以使用export and import database snapshots,它允许您在同一时刻有效地启动两个事务。
您必须将快照名称从一个程序传递到另一个程序。
当然,只有在第一个事务仍然在运行时启动第二个事务才有意义,因此除了您的方法之外,它还可以使用。
您应该能够做一些与您在问题中链接的答案非常相似的事情。只需使用操作系统中可用的任何调度机制来安排两个psql命令同时执行。在Windows中,使用内置的任务计划程序。
或者,如果您有能力,您可以创建一个简单的应用程序,在不同的连接和线程上执行命令。只需使用同步对象来同步命令执行。