当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL 中的 Table lock

郭凡
2023-03-14

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

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

共有2个答案

尉迟墨竹
2023-03-14

更严重的是:表级锁是用< code>LOCK TABLE语句完成的;见Ved的回答。还有行级锁(< code>SELECT...FOR [KEY] UPDATE|SHARE)和< code>SERIALIZABLE隔离中的乐观谓词锁定。还可以实现乐观并发控制(参见维基百科)。

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

看:

  • 在PostgreSQL的读提交隔离级别中可以发生丢失更新吗?
  • 为什么我们需要像Rabbitmq这样的消息代理而不是像postgres这样的数据库
  • 如何从PostgreSQL触发器发送电子邮件?
  • 在PostgreSQL表上工作的并发进程
  • “选择更新”何时锁定和解锁?
  • 带有一个ID列的Postgresql表,排序索引,具有重复的主键

并查看芹菜、ZeroMQ、ActiveMQ、RabbitMQ、Octobot等工具http://queues.io/

吕昀
2023-03-14

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

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

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

您还需要关注高度可伸缩的多线程程序,因为有可能一个应用程序锁定了表,然后该机器可能会停机。在这种情况下,您的表保持锁定,应用程序只是变得没有响应。(不过,这取决于您如何处理这种状态)。在这种情况下,某种过期机制可能会有所帮助,它会在特定时间后解锁该表。

希望这有帮助。

 类似资料:
  • 问题内容: 最近,我对PostgreSQL(使用8.2)非常熟悉,发现date_trunc函数对于轻松匹配某些天/月/等之间的时间戳非常有用。我认为,该功能的真正有用之处在于它可以将输出保持为时间戳格式。 我不得不切换到mySQL(5.0)并找到一些日期功能,而这些功能在比较中是比较缺乏的。提取函数似乎很有用,我发现的日期函数解决了我的一些问题,但是有没有办法复制PostgreSQL的date_t

  • 我当时正在为PostgreSQl编写PL/Python函数,Linux上已经安装了Python 2.7和Python 3.5。当我试图创建扩展plpythonu时,我遇到了一个错误,然后我修复了在终端执行命令的问题。我知道这是另一个包裹。 如果我没有安装Python2.7/3.5,并且我将安装plpython包,那么用户定义的函数还能工作吗?PL/Python如何依赖于Python?

  • 视图(view)是 SQL 的一个概念,指的是基于 SQL 语句结果集的可视化表。和表(table)一样,视图也拥有行、列和字段,视图的字段可以来自于一个或多个数据库中的表,因此又称为虚表,支持 SQL 函数、WHERE 以及 JOIN 语句。 视图的定义并不会影响数据库原本的结构设计,但是视图字段是表字段的映射,效果类似于编程语言中的引用类型,对视图的更新(如果允许更新的话)会反过来修改表中的数

  • 问题内容: 使用运算符将产生以下结果: 我希望能够实现以下结果(对于操作员来说只是一个占位符): 因此,您可以看到顶级键的子值已“合并”,使得结果包含和。 如何在Postgres中“深度”合并两个 JSONB 值? 如果可能的话,这可能吗? 一个更复杂的测试用例: 原始“合并”并成为对象的另一个测试用例: 问题答案: 您应该合并两个值都使用的未嵌套元素。在不平凡的查询中执行此操作可能会感到不舒服,

  • 问题内容: 我在PostgreSQL类型上使用%%运算符,该运算符将hstore(有效键值类型)转换为元素交替为{{key,value},{key value}}的数组。 当我想返回这些平坦的hstore的数组时,出现此错误:由于PostgreSQL缺乏对数组数组的支持。 从好奇心的角度来看,有人知道为什么不支持这些吗?更重要的是,这种情况是否可以解决? 目前,我将结果串联成一个字符串(用逗号分隔