如何在事务中获取SELECT语句的结果?

Ber*_*set 7 postgresql transactions

我无法通过 PostgreSQL 文档、Web 甚至 StackOverflow 上的这个简单问题获得信息......我一定不明白这里的一些重要内容。

我正在PostgreSQL 中做一个简单的SELECT/UPDATE事务:

START TRANSACTION;
SELECT "column" FROM "table" WHERE "criterion" = 'value' AND "activated" = true;
UPDATE "table" SET "activated" = false WHERE "criterion" = 'value';
COMMIT
Run Code Online (Sandbox Code Playgroud)

基本上,我需要在其activated状态为时获取列的值,true然后将其停用。PostgreSQL 告诉我有 1 行结果已被取消

如果我执行以下操作(基本上没有UPDATE语句的相同事务),也会发生同样的情况:

START TRANSACTION;
SELECT "column" FROM "table" WHERE "criterion" = 'value' AND "activated" = true;
COMMIT
Run Code Online (Sandbox Code Playgroud)

我对交易有什么不了解?任何SELECT输出都不能从交易块中出来吗?

Clo*_*eto 2

这将从更新的行中返回所有“列”的值:

UPDATE "table" SET "activated" = false WHERE "criterion" = 'value' AND "activated" = true
returning "column";
Run Code Online (Sandbox Code Playgroud)

与本次交易不存在关联关系。

returning将返回值,就像select发出 a 一样:

insert into foo (ticket, row, archived) values (3,7,true) returning *;
 ticket | row | archived 
--------+-----+----------
      3 |   7 | t
Run Code Online (Sandbox Code Playgroud)
update foo
set archived = true
where not archived
returning *;
 ticket | row | archived 
--------+-----+----------
      2 |   5 | t
Run Code Online (Sandbox Code Playgroud)

  • 如果这笔交易没有影响,第二笔怎么解释?包裹在事务中的简单“SELECT”隐藏了其结果...我没有使用 PL/pgSQL,RETURNING 在这里不起作用。以前从未见过该命令 (3认同)