我计划使用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来接收这些通知。我想找出确切的事务提交时间(记录可读取的时间),精确到微秒级别。我知道NOTIFY(pg_notify)实际上是在事务提交后立即发送通知,但我无法找出它发生的确切时间。我在NOTIFY中拥有的时钟时间戳值不是实际的事务提交时间。我猜测我监听通知的时间会接近事务提交时间,但我不确定它有多接近。首先,在我监听时,我的代码之间会有一些时间轮询(无论多么小),其次,我不确定NOTIFY/LISTEN通信本身是否存在滞后。有什么想法吗?我们有一个阅读器按批次选择行,使用“检查点”时间,每个批次获取上一个批次中最后一个时间戳之后的行,但我们丢失了一些行。(原因:时间戳值基于INSERT发生的时间(00.00.00)。在负载较重时,如果事务需要更长时间,它将在10秒后被插入(00.00.10),如果阅读器在那10秒内读取并找到其INSERT时间比row1晚(00.00.05)的行,则会错过这一行(row1)。问题的完整描述类似于此博客中写的问题:http://blog.thefourthparty.com/stopping-time-in-postgresql/)