锁定选定的行直到更新操作
lock the selected rows until update operation
我可以锁定特定的 selected 行直到更新完成吗?
我们已经编写了查询 selecting 来自 Java (CrudRepository) 的行并处理它们然后更新
问题是:- 如果有两个请求,并且我有 2 行可用于请求的条件,那么当前同一行由 select 对两个请求的查询 select 编辑。我们的期望是 select 不同的行而不是 select 相同。
如果您希望 SELECT
锁定 selected 行,并且您不希望两个并发查询 select 相同的行,请使用:
SELECT ... FROM atable
WHERE ...
FOR UPDATE SKIP LOCKED;
然后第一个查询将获取并 select 所有满足 WHERE
条件的行,而第二个查询什么也看不到。
两条评论:
您需要使用同时包含SELECT
和UPDATE
的事务,因为锁在事务结束时释放。
您可以在 SELECT
到 select 中添加一个 LIMIT
子句并锁定特定的最大行数。
我可以锁定特定的 selected 行直到更新完成吗?
我们已经编写了查询 selecting 来自 Java (CrudRepository) 的行并处理它们然后更新
问题是:- 如果有两个请求,并且我有 2 行可用于请求的条件,那么当前同一行由 select 对两个请求的查询 select 编辑。我们的期望是 select 不同的行而不是 select 相同。
如果您希望 SELECT
锁定 selected 行,并且您不希望两个并发查询 select 相同的行,请使用:
SELECT ... FROM atable
WHERE ...
FOR UPDATE SKIP LOCKED;
然后第一个查询将获取并 select 所有满足 WHERE
条件的行,而第二个查询什么也看不到。
两条评论:
您需要使用同时包含
SELECT
和UPDATE
的事务,因为锁在事务结束时释放。您可以在
SELECT
到 select 中添加一个LIMIT
子句并锁定特定的最大行数。