如何让触发器在其事务之外工作?

时间:2017-03-17 13:53:28

标签: postgresql

我认为触发器功能以某种方式在事务内部运行。有没有办法从触发器函数中发出语句,并在触发事务完成之前将结果显示给其他人?

我有一些冗长的触发操作(> 100毫秒)来更新用户访问权限。在压力测试中,当用户(即应用程序)在此触发操作期间向服务器请求新事件时,我发现了一个问题。

我的想法是在触发器的开头写出一个表的时间戳,以便根据这些信息调整外部请求,但我需要这个时间戳立即可见。

我会尝试更深入地解释一下:

我们的应用仅询问自上次请求以来的更改数据。当答案传递给应用程序时,还会为应用程序提供新的时间戳(称为lastUpdate)以便记住。当应用程序想要再次刷新数据时, lastUpdate 时间戳将在请求中发送。

问题场景示例:

  1. app从服务器请求新数据
  2. app接收数据以及lastUpdate = 01:00:00.000
  3. 半秒后应用程序要求自lastUpdate
  4. 以来的更改
  5. 有时候,应用会使用lastUpdated = 01:00:00.500
  6. 请求更多数据

    但是服务器和应用程序都不知道触发器正在更新某些数据。为了确保在请求时正确传递此数据,触发器会使用 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。

0 个答案:

没有答案