情况:
PostgresSQL 数据库。使用 SQL Alchemy ORM 的应用程序(不是很重要)。具有数百万行的表。
数百个进程使用该表访问数据库。每个人都想选择一行并根据其内容执行相对昂贵的操作,然后填充其他表并更新该行。
我使用的天真的方法是这样的:
SELECT * FROM table WHERE status = 'free';
然后在那之后:
UPDATE table SET status 'in_process';
现在的问题是这些操作不是原子的,这意味着在 和 之间的时间SELECT
内UPDATE
,最多 5 个其他进程可以选择该行并开始处理它(我提醒你,这非常昂贵)。
现在我知道有SELECT FOR UPDATE
哪些锁定行。但是它会锁定它们FOR UPDATE
(duh),它不会禁止选择行。
所以我想这一定是一个非常普遍的问题,但谷歌搜索并没有多大帮助。