我认为触发器功能以某种方式在事务内部运行。有没有办法从触发器函数中发出语句,并在触发事务完成之前将结果显示给其他人?
我有一些冗长的触发操作(> 100毫秒)来更新用户访问权限。在压力测试中,当用户(即应用程序)在此触发操作期间向服务器请求新事件时,我发现了一个问题。
我的想法是在触发器的开头写出一个表的时间戳,以便根据这些信息调整外部请求,但我需要这个时间戳立即可见。
我会尝试更深入地解释一下:
我们的应用仅询问自上次请求以来的更改数据。当答案传递给应用程序时,还会为应用程序提供新的时间戳(称为lastUpdate)以便记住。当应用程序想要再次刷新数据时, lastUpdate 时间戳将在请求中发送。
问题场景示例:
但是服务器和应用程序都不知道触发器正在更新某些数据。为了确保在请求时正确传递此数据,触发器会使用 now()对其进行时间戳。
触发器从00:59:59:999开始,因此这将是 modified_at 列的值。触发器在01:00:01.000完成其工作,因此在请求时间无法看到更改。
自01:00:00.500以来,数据库中没有任何更改,因此步骤4中的请求将不会获得任何数据。我们想要获取的更改的时间戳为00:59:59:99。
这是一个边缘案例,当我强迫应用程序每100毫秒刷新一次时,我偶然发现了它。
如果我能够在触发器开始时以某种方式从触发器传递到外部世界,触发器正在执行,我想我可以解决这个问题。
从已知时间戳中获取新数据,lastUpdate的概念可能很常见。还有一种解决我问题的常用方法吗?
BTW,我正在使用Postgres 9.6。