Java PostgreSQL中的表锁

Java PostgreSQL中的表锁,java,sql,multithreading,hibernate,postgresql,Java,Sql,Multithreading,Hibernate,Postgresql,我正在开发一个应用程序,它应该从一个表中获取数据,并在另一个表中记录处理结果。所有这些都在多个线程和一些计算机上实现。所以我需要使用一些同步机制。就我需要使用多台计算机而言,我必须在DB中使用一些同步机制(在我的例子中是PostgresSQL),而不是使用锁定代码。我知道postgres提供了一些表锁,但我没有找到任何文档如何设置它 可能已经存在一些标准解决方案了?是的,Postgres在表级别提供了锁定机制。您可以使用SQL锁定该表,然后在工作完成后将其解锁 有关详细信息,请参阅 但是考虑到您

我正在开发一个应用程序,它应该从一个表中获取数据,并在另一个表中记录处理结果。所有这些都在多个线程和一些计算机上实现。所以我需要使用一些同步机制。就我需要使用多台计算机而言,我必须在DB中使用一些同步机制(在我的例子中是PostgresSQL),而不是使用锁定代码。我知道postgres提供了一些表锁,但我没有找到任何文档如何设置它


可能已经存在一些标准解决方案了?

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

有关详细信息,请参阅

但是考虑到您的情况,您可以使用一些简单的机制来实现相同的功能,例如,向表中添加一个列-locking_status boolean。当一台机器使用它时,您可以使其成为现实,然后根据您的要求进行切换。但,若您有多个表,那个么锁定表是唯一的选项

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

希望这有帮助


看起来您正在尝试编写任务队列或消息队列。这真的很难做到。您希望我建议您使用一个经过良好测试的现有实现吗?

更严重的是:表级锁是通过
locktable
语句实现的;看维德的回答。还有行级锁(
SELECT…FOR[KEY]UPDATE | SHARE
)和
SERIALIZABLE
隔离中的乐观谓词锁。您还可以实现乐观并发控制(参见Wikipedia)

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

见:


并查看芹菜、ZeroMQ、ActiveMQ、RabbitMQ、Octobot等工具。请参见

您的意思是数据库有多个副本?每台计算机一个?不,所有应用程序都有一个数据库。我认为您需要显示处理逻辑以及它是如何分布的。但我可能错了。我的任务正在尝试编写任务队列或类似的东西。@Vartlok,那么不要!使用一个现有的测试实现。