Answers:
是。
您在同一事务中执行的所有操作对于同一事务中的后续命令都是可见的。只是在提交之前不进行其他交易。对于所有隔离级别都是如此,除非Read uncommitted
可能出现“脏读”(但这本身不会影响您的问题)。
它是基于MVCC模型(多版本并发控制)来实现的,该模型基于TransactionId
确定每个表行的年龄和可见性。在同一事务中写入的每个新行版本都相同xmin
,并被视为“同时”发生。
同一命令中存在多个CTE(通用表表达式)的特殊情况。可能会认为这些顺序是顺序执行的,但是除非一个CTE引用另一个,否则它们的顺序是任意的。从查询开始,所有这些人都看到相同的快照。
例:
高级示例:
我们试试吧 :
CREATE OR REPLACE FUNCTION public.sp_get_user()
RETURNS json
LANGUAGE plpgsql
AS $function$BEGIN
INSERT INTO users (name, password) VALUES ('deadeye', 'test');
RETURN row_to_json(row) FROM (SELECT name, password FROM users WHERE name = 'deadeye') row;
END;$function$
现在,让我们测试一下:
SELECT sp_get_user();
{"name":"deadeye","password":"test"}
有用 !正如Erwin所说,交易中所做的一切在交易内部都是可见的。隔离仅在不同线程之间。