Postgres Serializable似乎不如所述工作

问题描述 投票:2回答:1

我是Postgres的新手,过去对事务隔离没有非常仔细的研究。但是,根据Postgres文档,我没有看到我期望的行为。特别是,似乎在过时读取的预期中我没有收到错误。这是给Postgres 12的。

假设如下表

CREATE TABLE public.transactiontest (id int8 NULL, col_a varchar NULL);
INSERT INTO public.transactiontest (id, col_a) VALUES (1, 'aaa'), (2, 'bbb');

在两个会话上执行...

--Session 1
START TRANSACTION ISOLATION LEVEL SERIALIZABLE; --1
SELECT id, col_a FROM public.transactiontest; --2

--Session 2
START TRANSACTION ISOLATION LEVEL SERIALIZABLE; --3
SELECT id, col_a FROM public.transactiontest; --4

--Session 1
UPDATE public.transactiontest SET col_a = 'ccc' where id = 1; --5
COMMIT; --6

--Session 2
COMMIT; --7

我本以为我会在第7行出现错误,但是在那里的提交仍然可以通过。看来这会违反文档

好像交易是一个接一个地依次执行,而不是同时进行。

因为对会话1然后2进行排序,第4行的结果与对2然后1进行排序的结果不同。

我不明白什么?

sql postgresql concurrency transactions serializable
1个回答
1
投票

如果会话2在会话1之前运行,结果将是相同的。

因此,执行“第一个会话2,然后会话1”是工作负载的序列化

这意味着工作负载是可序列化的。

实际上,会话1在会话2之前开始并不重要。只要有等效的串行执行,我们就很好。

© www.soinside.com 2019 - 2024. All rights reserved.