【发布时间】:2015-12-31 01:58:13
【问题描述】:
我打算使用 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 通信本身之间是否存在任何滞后。
有什么想法吗?
更新(问题的完整描述):我们有一个阅读器使用“检查点”时间分批选择行,其中每个批次获取上一个批次中最后一个时间戳之后的行,我们缺少行。 (原因:时间戳值基于插入发生的时间(00.00.00)。在重负载下,如果事务需要更长的时间,它会被插入,比如说 10 秒后(00.00.10),读者会错过这一行(row1) 如果它在那 10 秒内读取并找到其 INSERT 时间比 row1 更晚的时间(00.00.05) 的行。问题的完整描述类似于此博客中所写的。http://blog.thefourthparty.com/stopping-time-in-postgresql/ )
【问题讨论】:
-
呃……为什么?你想用这个来达到什么目的?您试图解决的根本问题是什么,您需要它的原因是什么?
-
我在描述中更新了我们试图解决的问题。
-
所以您只是想实现一个具有多个写入器和一个读取器的可靠队列?试图以这种方式修复无序提交和可见性问题是行不通的。考虑在实际的基础主题上发布一个新的单独问题,即当队列读取器扫描表然后在读取后提交正在进行的事务时如何避免丢失行。令人沮丧的是你之前忽略了我的问题。
-
在这里发布了一个单独的问题。 stackoverflow.com/questions/32946852/…
标签: postgresql real-time notify listen low-latency