Num*_*our 31 postgresql transaction
也许这是一个愚蠢的初学者问题,但我在任何地方都找不到答案。我到处都读到了Transaction Isolation解决并发事务中数据可见性的方法。我关心的是单个事务中的行为。
如果我开始一个事务,插入一些数据,我是否能够在之后立即选择它们 - 仍然在同一个但未提交的事务中?如果是,在并发事务的情况下,这种行为是否可以像提到的事务隔离一样以类似的方式改变?
具体来说,我的目标是 PostgreSQL 9.4。
Erw*_*ter 26
是的。
你在同一个事务中所做的一切对同一个事务中的后续命令都是可见的。只是在提交之前不要进行其他交易。这适用于所有隔离级别,除非Read uncommitted可能出现“脏读”(但这不会影响您的问题本身)。
它是使用MVCC 模型(多版本并发控制)实现的,基于TransactionId确定每个表行的相对年龄和可见性。在同一事务中写入的每个新行版本都相同xmin,并被认为是“同时”发生的。
同一命令中存在多个CTE(通用表表达式)的极端情况。人们可能认为这些是顺序执行的,但除非一个 CTE 引用另一个,否则它们的顺序是任意的。并且所有这些都从查询开始时看到相同的快照。这就是为什么不允许UPDATE在同一查询的多个 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$
Run Code Online (Sandbox Code Playgroud)
现在,让我们测试:
SELECT sp_get_user();
{"name":"deadeye","password":"test"}
Run Code Online (Sandbox Code Playgroud)
有用 !正如 Erwin 所说,交易中所做的一切在交易中都是可见的。隔离仅在不同线程之间。
| 归档时间: |
|
| 查看次数: |
27323 次 |
| 最近记录: |