【发布时间】:2020-04-04 00:57:54
【问题描述】:
我是 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