Sql Postgres Serializable似乎无法按描述工作
我是Postgres的新手,过去没有仔细研究过事务隔离。然而,据博士后的医生说,我没有看到我所期望的行为。特别是,我似乎没有得到一个错误的地方,预计陈旧的读取。这是为12年级的博士后准备的 假设一个表如下Sql Postgres Serializable似乎无法按描述工作,sql,postgresql,concurrency,transactions,serializable,Sql,Postgresql,Concurrency,Transactions,Serializable,我是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'
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进行排序不同的结果
我不明白什么?如果会话2在会话1之前运行,结果将是相同的 因此,执行“第一个会话2,然后是会话1”是工作负载的序列化 这意味着工作负载是可序列化的
实际上,第1课时在第2课时之前开始并不重要。只要有等效的串行执行,我们就可以了。是的,对不起,我在update语句中出错了。我已经修复了它,所以现在值从初始值更改为。这对你的解释有什么影响?没什么区别。你自己试试看:首先像你在问题中所做的那样,然后序列化(首先是会话2中的所有语句,然后是会话1中的所有语句)。您将看到这两种情况下的结果是相同的。如果我在会话2之前运行会话1,那么在会话2中读取的值将是“ccc”。相反,我会读“aaa”,没错。它并不与所有串行执行不一致,因为它与一个串行执行一致。当“Heureka”出现时,看到闪光总是很好的。非常值得努力:^)