阻止SELECT直到结果可用

时间:2010-08-13 00:05:12

标签: php sql postgresql

我正在尝试为'long-polling'编写PHP脚本,在将新行添加到(Postgres)数据库表时返回数据。是否有任何方法可以让SELECT查询仅在返回结果时返回,否则阻塞?或者我应该在数据库之外使用另一种信令机制吗?

5 个答案:

答案 0 :(得分:4)

看看LISTEN / NOTIFY:

  

NOTIFY命令发送一个   每个客户的通知事件   以前的申请   执行指定的LISTEN名称   当前的通知名称   数据库

http://www.postgresql.org/docs/8.4/static/sql-notify.html

您可以向表中添加“ON INSERT”触发器以触发NOTIFY事件。但是,您需要另外一种机制来确定需要选择哪些记录,因为使用NOTIFY事件传递有效负载的能力在9.0之前将无法使用:

http://www.postgresql.org/docs/9.0/static/sql-notify.html

答案 1 :(得分:2)

没有阻止选择语句。

你可以定期发出select语句 - 这会产生一定的开销。如果查询很昂贵,那么你可能会写一个更便宜的查询(*)并跟踪可能返回的新条目,如果数字更改则发出更昂贵的查询。

答案 2 :(得分:0)

您可以查看LOCKFOR UPDATEFOR UPDATE可以允许查询等待,直到被选中的行被解锁。我不确定是否存在超时或者有大量资源可能产生的资源影响,但这是一种可能性。

答案 3 :(得分:0)

当你应该考虑轮询时,你正试图获得一个中断(事件)。

创建并调用存储过程,该存储过程将确定客户端是否应检索新行。如果这是一个Web应用程序,请定期调用Ajax方法,该方法将在服务器上查询数据库以查看自上次调用以来是否有新行。如果是这样,请运行另一个查询以检索它们并将它们发送回客户端。

答案 4 :(得分:0)

我喜欢postgres和所有,但如果你想做一些简单的事情而不是超级企业,也许redis对你来说已经足够了。我自己使用它已经取得了很大的成功,它可以扩展。

http://code.google.com/p/redis/