Postgresql 如何让触发器在其事务之外工作?
我认为触发器函数在事务内部运行。在触发器事务完成之前,是否有任何方法可以从触发器函数中发出语句并使结果对其他人可见 我有一些冗长的触发操作(>100毫秒)用于更新用户访问权限。在一次压力测试中,当用户(即应用程序)在触发操作期间向服务器请求新事件时,我发现了一个问题 我的想法是在触发器开始时向表中写入一个时间戳,以便可以根据此信息调整外部请求,但我需要此时间戳立即可见 我将尝试更深入地解释: 我们的应用程序只要求自上次请求后更改的数据。当答案发送到应用程序时,还会发送一个新的时间戳(称为lastUpdate),以便应用程序记住。当应用程序希望再次刷新数据时,将在请求中发送lastUpdate时间戳 问题场景示例:Postgresql 如何让触发器在其事务之外工作?,postgresql,Postgresql,我认为触发器函数在事务内部运行。在触发器事务完成之前,是否有任何方法可以从触发器函数中发出语句并使结果对其他人可见 我有一些冗长的触发操作(>100毫秒)用于更新用户访问权限。在一次压力测试中,当用户(即应用程序)在触发操作期间向服务器请求新事件时,我发现了一个问题 我的想法是在触发器开始时向表中写入一个时间戳,以便可以根据此信息调整外部请求,但我需要此时间戳立即可见 我将尝试更深入地解释: 我们的应用程序只要求自上次请求后更改的数据。当答案发送到应用程序时,还会发送一个新的时间戳(称为last
顺便说一句,我正在使用Postgres 9.6。您正在寻找“自动提交”。搜索一下,你会学到更多。博士后并不直接支持它,但有一些变通办法,尽管不太好。但是,这并不能解决您的竞争条件。您的问题有一个简单的解决方案:只要在服务器响应时(缓存)
lastUpdated
值自提供的上次更新日期以来没有任何更改,就不要更改应用程序的(缓存)lastUpdated
值。在您的示例场景中,4。要点是:有时,应用程序会在lastUpdated=01:00:00.000时请求更多数据。@pozs。谢谢但我认为这不会奏效。如果应用程序接收到一些其他数据怎么办。我必须缓存最新更新的数据,但无论如何都可能错过触发器创建的数据。我刚刚发现了“建议锁”。这种锁似乎对解决这个问题很有用。当我知道它是如何工作的时候,我会回来的。@Michael这就是问题的关键:当一个事务还没有提交时,你无论如何也看不到更改的数据。你在寻找“自动提交”。搜索一下,你会学到更多。博士后并不直接支持它,但有一些变通办法,尽管不太好。但是,这并不能解决您的竞争条件。您的问题有一个简单的解决方案:只要在服务器响应时(缓存)lastUpdated
值自提供的上次更新日期以来没有任何更改,就不要更改应用程序的(缓存)lastUpdated
值。在您的示例场景中,4。要点是:有时,应用程序会在lastUpdated=01:00:00.000时请求更多数据。@pozs。谢谢但我认为这不会奏效。如果应用程序接收到一些其他数据怎么办。我必须缓存最新更新的数据,但无论如何都可能错过触发器创建的数据。我刚刚发现了“建议锁”。这种锁似乎对解决这个问题很有用。当我知道它是如何工作的时候,我会回来的。@Michael这就是问题的关键:当一个事务还没有提交时,你无论如何都不会看到更改的数据。