sql - 锁定多行但只得到一行作为返回结果

标签 sql postgresql postgresql-10

我需要锁定多行,但返回结果只得到一行,例如锁定用户:2,4和7,但只获取用户where id = 2

的数据

嗯,据我了解,有两种可能的方法:

1) 运行两个不同的查询:

-- get user data and lock that row
SELECT some_column FROM users WHERE id = 2 FOR UPDATE INTO my_var;

-- just lock another rows
SELECT some_column FROM users WHERE id IN(4,7) FOR UPDATE;

2) 使用一个查询,使用 CTE 和“假”更新,例如:

WITH t AS(
    UPDATE users 
    SET some_column = some_column 
    WHERE id IN(2,4,7)
    returning some_column
)
SELECT some_column FROM t WHERE id = 2
INTO my_var;

那么,哪种方式更合适呢?或者可能有更好的方法?

最佳答案

我会使用 CTE,但没有真正的更新:

示例表和数据:

t=# create table su(i int);
CREATE TABLE
t=# insert into su values(1),(2),(3),(4);
INSERT 0 4

选择更新三键返回一键:

begin; 
with l as (select * from su where i in (1,2,4) for update)
select * from l where i = 2;
BEGIN
 i
---
 2
(1 row)

试图:

begin; update su set i=i where i = 1;

在不同的 session 中等待上面的事务完成,而 where i = 1 则不会。并且第一个事务中的 SQL 仅返回 where i = 2

关于sql - 锁定多行但只得到一行作为返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48396695/

相关文章:

python - 模型中 django dateTime 的正确格式是什么?

PostgreSQL 可以使用 HASH 排除约束来实现唯一性吗?

java - 我用 Hibernate/JPA 得到一个 "error, string or binary data would be truncated"

activerecord - 兼容macruby的简单持久化框架?

sql - 向postgresql中的列添加递增值

postgresql - 尝试转储在 CentOS 7 机器上运行的 PostgreSQL-10 数据库并将其恢复到 Windows 10 机器中

c# - 'Npgsql.PoolManager' 的类型初始值设定项抛出异常

sql - 将自动递增字段更改为前一个

mysql - 拆分字符串并循环遍历 MySQL 存储过程中的值

json - Postgresql:需要获取Json格式的值