我可以选择插入同一未提交事务中的数据吗?


21

也许这是一个愚蠢的初学者问题,但是我在任何地方都找不到答案。我到处都读到关于的信息Transaction Isolation,它解决了并发事务中数据的可见性。我担心的是一次交易中的行为。

如果我开始交易,请插入一些数据,我是否可以立即选择它们-仍在同一但尚未提交的交易中?如果是,在并发事务的情况下,是否可以像上述事务隔离那样以类似的方式更改此行为?

具体来说,我的目标是PostgreSQL 9.4。

Answers:


17

是。
您在同一事务中执行的所有操作对于同一事务中的后续命令都是可见的。只是在提交之前不进行其他交易。对于所有隔离级别都是如此,除非Read uncommitted可能出现“脏读”(但这本身不会影响您的问题)。

它是基于MVCC模型(多版本并发控制)来实现的,该模型基于TransactionId确定每个表行的年龄和可见性。在同一事务中写入的每个新行版本都相同xmin,并被视为“同时”发生。

同一命令中存在多个CTE(通用表表达式)的特殊情况。可能会认为这些顺序是顺序执行的,但是除非一个CTE引用另一个,否则它们的顺序是任意的。从查询开始,所有这些人都看到相同的快照。

例:

高级示例:


3

我们试试吧 :

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所说,交易中所做的一切在交易内部都是可见的。隔离仅在不同线程之间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.