我正在处理一个应用程序,它应该从一个表中获取数据并在另一个表中记录处理结果。所有这些都在一个线程和几台计算机上。所以我需要使用一些同步机制。至于我需要使用更多的那台计算机,我必须在DB中使用一些同步机制(在我的情况下它是PostgresSQL),而不是在代码中使用锁。我知道postgres提供了一些锁定表,但我没有找到任何文档如何设置它。
可能存在一些标准解决方案吗?
答案 0 :(得分:1)
是的,Postgres在表级提供锁定机制。您可以使用SQL锁定表,然后在作业完成后将其解锁。
有关详细信息,请参阅the explicit locking chapter of the manual。
但考虑到你的情况,你可以使用一些简单的机制来实现相同的功能,例如,向表中添加一个列 - locking_status boolean。当一台机器使用它时,您可以将其设置为TRUE,然后根据您的要求进行切换。但是,如果您有多个表,则只能选择锁定表。
您还需要处理高度可扩展的多线程程序,因为有可能一个应用程序已锁定该表,然后该计算机可能会关闭。在这种情况下,您的表保持锁定状态,应用程序只是无响应。 (但取决于你如何处理这种状态)。在这种情况下,某种过期机制可能有助于在特定时间后解锁表格。
希望这有帮助。
答案 1 :(得分:1)
<大眼夹>
您似乎正在尝试编写任务队列或消息队列。这些真的很难做对。您是否希望我建议您使用经过良好测试的实施方案? < /大眼夹>
更严重的是:使用LOCK TABLE
语句完成表级锁定;看到Ved的回答。在SELECT ... FOR [KEY] UPDATE|SHARE
隔离中还有行级锁(SERIALIZABLE
)和乐观谓词锁定。您还可以实现乐观并发控制(请参阅Wikipedia)。
但是,实际创建并发任务或消息队列真的很难。您提出的大多数解决方案实际上都会被序列化,因此一次只能运行一个任务,或者无法处理中止/崩溃等任务。
请参阅:
并研究Celery,ZeroMQ,ActiveMQ,RabbitMQ,Octobot等工具。请参阅http://queues.io/