相关疑难解决方法(0)

在Postgresql中选择未锁定的行

有没有办法在Postgresql中选择未锁定的行?我有一个多线程应用程序将执行:

Select... order by id desc limit 1 for update
Run Code Online (Sandbox Code Playgroud)

在桌子上.

如果多个线程运行此查询,它们都会尝试拉回同一行.

一个获取行锁,另一个获取然后在第一个更新行后失败.我真正喜欢的是第二个线程获取匹配该WHERE子句的第一行并且尚未锁定.

为了澄清,我希望每个线程在执行select之后立即更新第一个可用行.

因此,如果有行ID: 1,2,3,4,第一个线程将进入,选择行ID=4并立即更新它.

如果在该事务期间第二个线程出现,我希望它能获得行ID=3并立即更新该行.

对于Share,也不会完成此操作,nowait因为该WHERE子句将与锁定的行匹配(ID=4 in my example).基本上我喜欢的是这个WHERE条款中的"并没有锁定" .

Users

-----------------------------------------
ID        | Name       |      flags
-----------------------------------------
1         |  bob       |        0
2         |  fred      |        1
3         |  tom       |        0
4         |  ed        |        0
Run Code Online (Sandbox Code Playgroud)

如果查询是" Select ID from users where flags = 0 order by ID desc limit …

postgresql locking

42
推荐指数
5
解决办法
1万
查看次数

PostgreSQL - 实现可靠的队列

我正在尝试使用postgres数据库实现具有多个编写器和多个读取器的可靠队列.如何避免在队列读取器扫描表时丢失行,然后在读取后正在进行的事务提交.

我们有一个读者使用"检查点"时间批量选择行,其中每个批次获取上一批次中最后一个时间戳之后的行,并且我们缺少行.(原因:时间戳值基于INSERT发生的时间(00.00.00).在重负载时,如果事务需要更长的时间,它会被插入,比如10秒后(00.00.10),读者将错过这一行(row1)如果它在10秒内读取并找到一个行,其行的INSERT时间晚于(00.00.05)而不是row1.问题的完整描述类似于本博客中写的那个.http:/ /blog.thefourthparty.com/stopping-time-in-postgresql/)

相关的上下文问题:Postgres LISTEN/NOTIFY - 低延迟,实时?

更新:我已经将问题从单个读者更新到多个读者.读者阅读的顺序很重要.

postgresql queue concurrency

12
推荐指数
1
解决办法
1032
查看次数

PostgreSQL和锁定

希望一些比我聪明的DBA可以帮助我找到一个很好的解决方案,我需要做什么.

为了便于讨论,我们假设我有一个名为"work"的表,其中包含一些列,其中一列是表示来自给定客户端的该行工作的所有权的列.方案是我将连接2个客户端并轮询表以完成工作,当一行(或一些行)显示时,选择行的第一个客户端也将更新它们以暗示所有权, update将删除这些行,不会返回任何其他客户端的选择.我的问题是,在这种情况下,我可以使用什么样的锁来阻止2个客户端同时敲击表,并且两个客户端都通过select返回相同的行?

sql postgresql locking

2
推荐指数
1
解决办法
2048
查看次数

标签 统计

postgresql ×3

locking ×2

concurrency ×1

queue ×1

sql ×1