繁体   English   中英

PostgreSQL中的表锁

[英]Table lock in PostgreSQL

我正在开发一个应从一个表中获取数据并在另一表中记录处理结果的应用程序。 所有这些都在一个线程和几台计算机上完成。 因此,我需要为此使用一些同步机制。 至于我需要使用更多的一台计算机,我必须在数据库中使用某种同步机制(在我的情况下是PostgresSQL),而不是使用代码锁定。 我知道postgres提供了对表的锁定,但是我没有找到任何文档来设置它。

可能已经有一些标准的解决方案了吗?

是的,Postgres在表级别提供了锁定机制。 您可以使用SQL锁定表,然后在完成工作后将其解锁。

有关详细信息,请参见手册的显式锁定章节

但是考虑到您的情况,您可以使用一些简单的机制来实现相同的目的,例如,向表中增加一列-locking_status布尔值。 一台机器使用它时,可以将其设置为TRUE,然后根据需要进行切换。 但是,如果您有多个表,那么锁定表是唯一的选择。

您还需要照顾高度可扩展的多线程程序,因为一个应用程序可能已锁定了表,然后该计算机可能会关闭。 在这种情况下,您的表将保持锁定状态,应用程序将变得无响应。 (但是取决于您如何处理此状态)。 在这种情况下,某种过期机制可能会有所帮助,它将在特定时间后解锁表。

希望这可以帮助。

<clippy>
看来您正在尝试编写任务队列消息队列 这些真的很难解决。 您是否希望我提出一个经过良好测试的现有实现方案供您使用?
</ clippy>

更严重的是:表级锁定是通过LOCK TABLE语句完成的; 参见韦德的答案。 还存在行级锁( SELECT ... FOR [KEY] UPDATE|SHARE )和SERIALIZABLE隔离中的乐观谓词锁。 您还可以实现乐观并发控制(请参阅Wikipedia)。

但是,实际上很难创建并发任务或消息队列。 您提出的大多数解决方案实际上都会序列化,因此一次只能执行一个任务,否则将无法处理中止/崩溃等任务。

看到:

并研究诸如Celery,ZeroMQ,ActiveMQ,RabbitMQ,Octobot等工具。请参见http://queues.io/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM