Postgres Serializable 似乎不像描述的那样工作
Postgres Serializable does not seem to work as described
我是 Postgres 的新手,过去没有仔细研究过事务隔离。但是,根据 Postgres 文档,我没有看到预期的行为。特别是,我似乎没有收到预期的过时读取错误。这是针对 Postgres 12 的。
假设table如下
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 行遇到错误,但那里的提交通过了。这似乎违反了文档
as if transactions had been executed one after another, serially,
rather than concurrently.
因为排序会话 1 然后 2 与排序 2 然后 1 相比,第 4 行会给出不同的结果。
我哪里不明白?
如果会话 2 在会话 1 之前 运行,结果将是相同的。
因此,执行“first session2, then session 1”是工作负载的序列化。
这意味着工作负载是可序列化的。
实际上会话 1 在会话 2 之前开始并不重要。只要有一个等效的串行执行,我们就很好。
我是 Postgres 的新手,过去没有仔细研究过事务隔离。但是,根据 Postgres 文档,我没有看到预期的行为。特别是,我似乎没有收到预期的过时读取错误。这是针对 Postgres 12 的。
假设table如下
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 行遇到错误,但那里的提交通过了。这似乎违反了文档
as if transactions had been executed one after another, serially, rather than concurrently.
因为排序会话 1 然后 2 与排序 2 然后 1 相比,第 4 行会给出不同的结果。
我哪里不明白?
如果会话 2 在会话 1 之前 运行,结果将是相同的。
因此,执行“first session2, then session 1”是工作负载的序列化。
这意味着工作负载是可序列化的。
实际上会话 1 在会话 2 之前开始并不重要。只要有一个等效的串行执行,我们就很好。