由于某些业务原因,我正在运行查询SELECT * FROM table WHERE updated_at > $1 AND user_id = $2;
。
考虑两个事务 A 和 B,它们正在更新表中的行:UPDATE table SET value = $1, updated_at = NOW() WHERE id = $2;
。事务 A 首先开始,因此updated_at
A 的 row 早于 B 的 row updated_at
。然而,由于某种原因,A 放慢了速度,B 先提交了。
如果第一个查询在 A 提交之前运行,则软件将显示 B 的行,但不会显示 A 的行,企业表示这是不可接受的。
这可以通过使用来解决pg_xact_commit_timestamp()
,但是当事务完成而不是提交时返回(这可能适合我的用例)。
另一个解决方案可能是在更新行之前运行事务SELECT FROM table WHERE user_id = $1 FOR UPDATE;
,但这些查询是更大事务的一部分,我认为这会破坏写入性能。
一个简单的解决方案似乎是让事务 B 等待 A 提交。有办法做到这一点吗?