Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何让触发器在其事务之外工作?_Postgresql - Fatal编程技术网

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

Postgresql 如何让触发器在其事务之外工作?,postgresql,Postgresql,我认为触发器函数在事务内部运行。在触发器事务完成之前,是否有任何方法可以从触发器函数中发出语句并使结果对其他人可见 我有一些冗长的触发操作(>100毫秒)用于更新用户访问权限。在一次压力测试中,当用户(即应用程序)在触发操作期间向服务器请求新事件时,我发现了一个问题 我的想法是在触发器开始时向表中写入一个时间戳,以便可以根据此信息调整外部请求,但我需要此时间戳立即可见 我将尝试更深入地解释: 我们的应用程序只要求自上次请求后更改的数据。当答案发送到应用程序时,还会发送一个新的时间戳(称为last

我认为触发器函数在事务内部运行。在触发器事务完成之前,是否有任何方法可以从触发器函数中发出语句并使结果对其他人可见

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

我的想法是在触发器开始时向表中写入一个时间戳,以便可以根据此信息调整外部请求,但我需要此时间戳立即可见

我将尝试更深入地解释:

我们的应用程序只要求自上次请求后更改的数据。当答案发送到应用程序时,还会发送一个新的时间戳(称为lastUpdate),以便应用程序记住。当应用程序希望再次刷新数据时,将在请求中发送lastUpdate时间戳

问题场景示例:

  • 应用程序从服务器请求新数据
  • 应用程序接收数据以及lastUpdate=01:00:00.000
  • 半秒钟后,应用程序要求更改自上次更新以来的内容
  • 有时,应用程序会在LastUpdate=01:00:00.500时请求更多数据
  • 但无论是服务器还是应用程序都不知道触发器正在此时更新某些数据。为了确保在请求时正确传递此数据,触发器会在其上加上now()时间戳

    触发器在00:59:59:999开始,因此这将是在列中修改的值。触发器在01:00:01.000完成其工作,因此更改在请求时不可见

    数据库中自01:00:00.500以来没有任何更改,因此步骤4中的请求将不会获得任何数据。我们要获取的更改的时间戳为00:59:59:99

    这是一个边缘案例,当我强制应用程序每100毫秒刷新一次时,我偶然发现了它

    如果我能在触发器开始执行时,以某种方式从触发器与外部世界通信,我想我能解决这个问题

    lastUpdate的概念在从已知时间戳获取新数据时可能非常常见。有没有一个共同的方法来解决我的问题


    顺便说一句,我正在使用Postgres 9.6。

    您正在寻找“自动提交”。搜索一下,你会学到更多。博士后并不直接支持它,但有一些变通办法,尽管不太好。但是,这并不能解决您的竞争条件。您的问题有一个简单的解决方案:只要在服务器响应时(缓存)
    lastUpdated
    值自提供的上次更新日期以来没有任何更改,就不要更改应用程序的(缓存)
    lastUpdated
    值。在您的示例场景中,4。要点是:有时,应用程序会在lastUpdated=01:00:00.000时请求更多数据。@pozs。谢谢但我认为这不会奏效。如果应用程序接收到一些其他数据怎么办。我必须缓存最新更新的数据,但无论如何都可能错过触发器创建的数据。我刚刚发现了“建议锁”。这种锁似乎对解决这个问题很有用。当我知道它是如何工作的时候,我会回来的。@Michael这就是问题的关键:当一个事务还没有提交时,你无论如何也看不到更改的数据。你在寻找“自动提交”。搜索一下,你会学到更多。博士后并不直接支持它,但有一些变通办法,尽管不太好。但是,这并不能解决您的竞争条件。您的问题有一个简单的解决方案:只要在服务器响应时(缓存)
    lastUpdated
    值自提供的上次更新日期以来没有任何更改,就不要更改应用程序的(缓存)
    lastUpdated
    值。在您的示例场景中,4。要点是:有时,应用程序会在lastUpdated=01:00:00.000时请求更多数据。@pozs。谢谢但我认为这不会奏效。如果应用程序接收到一些其他数据怎么办。我必须缓存最新更新的数据,但无论如何都可能错过触发器创建的数据。我刚刚发现了“建议锁”。这种锁似乎对解决这个问题很有用。当我知道它是如何工作的时候,我会回来的。@Michael这就是问题的关键:当一个事务还没有提交时,你无论如何都不会看到更改的数据。