当前位置: 首页 > 面试题库 >

PostgreSQL和锁定

公冶弘壮
2023-03-14
问题内容

希望有一些比我更聪明的DBA,可以帮助我找到所需做的很好的解决方案。

为了便于讨论,假设我有一个名为“
work”的表,其中包含一些列,其中之一是代表来自给定客户端的该行工作的所有权的列。场景是我将连接2个客户端,并轮询一个表以完成工作,当显示一行(或一定数量的行)时,选择该行的第一个客户端也将对其进行更新以暗示所有权,即更新将删除那些返回给其他任何客户选择内容的行。我的问题是,在这种情况下,我可以使用哪种锁定方式来防止2个客户端同时命中该表,并使两个客户端都通过select返回相同的行?


问题答案:

带有RETURNING子句的UPDATE语句是执行此操作的方法。

UPDATE table
SET ownership = owner
RETURNING ( column list );

参考:

类似问题

文献资料



 类似资料:
  • 锁主要是为了保持数据库数据的一致性,可以阻止用户修改一行或整个表,一般用在并发较高的数据库中。 在多个用户访问数据库的时候若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 数据库中有两种基本的锁:排它锁(Exclusive Locks)和共享锁(Share Locks)。 如果数据对象加上排它锁,则其他的事务不能对它读取和修改。 如果加上共享锁,则该数据库对象可以被其他事务

  • 问题内容: 假设我有一个名为取款的表(id,金额,user_id,状态)。 每当我开始提款时,流程如下: 验证用户是否有足够的余额(按收到的金额之和-取款金额之和计算) 插入行,其金额为user_id,status =``结束’‘。 通过gRPC调用第三方软件以发起提款(实际上是汇款),等待响应 如果我们收到肯定的答复,请立即更新状态为“已完成”的行;如果提款失败,则删除该条目。 但是,我在此流程

  • 我有一个表和几个线程(系统),它们从表中读取特定列并更新它。因此,我的问题如下: 我想确保在任何时候只有一个线程可以选择和更新该列。最好的解决方案是什么? PS:据我所知,在SQL Server中使用事务会锁定事务中的所有资源,但我对PostgreSQL一无所知。 非常感谢。

  • 我试图使用Spring数据JPA(2.1)和Hibernate在PostgreSQL上执行跳过锁定查询。查询如下所示: 根据Spring数据JPA native query skip locked和Select for update skip locked from JPA level,它应该可以工作,但生成的查询只选择update而不跳过锁定的行。 生成的查询: Hibernate:选择obj0

  • 问题内容: 我们有75台(并且正在不断增长)服务器需要通过Redis共享数据。理想情况下,所有75台服务器都希望通过操作写入Redis中的两个字段。我们预计最终在这两个领域上可能有数百万次的每日写入操作和数 十亿次 的每日读取。此数据 必须 是持久性的。 我们担心,Redis锁定可能会导致多次重试写入操作,而同时尝试增加同一字段的次数。 问题: 在一个非常重的负载下,在一个字段上同时执行多个操作是

  • 我们有一个系统,我们偶尔会得到一个乐观的锁定异常。我们在代码中已经解决了这个问题,但现在我正在查看JPA 2,并看到它有一个用于处理这个问题的注释(@版本) 我们的问题是,一个表上有多个事务,如果表锁已满,则即使未对相同的记录进行更改,也会导致乐观锁定异常。 我们在JBoss 4.2服务器上使用hibernate,数据库可以是MySQL或SQL服务器。 如果改为使用@Version,这会在两个数据