我特别想知道PostgreSQL.鉴于以下人为的例子:
SELECT name FROM
(SELECT name FROM people WHERE age >= 18 ORDER BY age DESC) p
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
从外部查询返回的名称是否保证按内核查询的顺序排列?
这个问题可以被视为对我的评论的后续跟进可以两个并发但相同的DELETE语句导致死锁吗?.
我想知道my_status在以下语句中行是否按升序锁定:
SELECT 1 FROM my_table ORDER BY my_status FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
https://www.postgresql.org/docs/9.5/static/sql-select.html上有一句有趣的评论说:
SELECT在READ COMMITTED事务隔离级别运行的命令以及使用ORDER BY和锁定子句可能无序地返回行.这是因为ORDER BY首先应用.该命令对结果进行排序,但可能会阻止尝试获取一个或多个行的锁定.一旦SELECT疏导,一些排序列值可能已被修改,导致出现被淘汰的顺序(尽管它们是为了在原有的列值而言)的行.例如,可以通过将FOR UPDATE/SHARE子句放在子查询中来根据需要解决这个问题Run Code Online (Sandbox Code Playgroud)SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss ORDER BY column1;
我不确定这是否能回答我的问题.所有这些都是ORDER BY首先应用的,并且您需要放入FOR UPDATE子查询来解决副作用,如果在此期间更改了订单列的值,实际输出顺序可能会有所不同.换句话说,放入FOR UPDATE子查询可确保在订购之前发生锁定.
但这并没有真正告诉我们这些行是否实际上是按照ORDER BY条款确定的顺序锁定的?