Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres Serializable似乎无法按描述工作_Sql_Postgresql_Concurrency_Transactions_Serializable - Fatal编程技术网

Sql Postgres Serializable似乎无法按描述工作

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'

我是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进行排序不同的结果


我不明白什么?

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

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

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


实际上,第1课时在第2课时之前开始并不重要。只要有等效的串行执行,我们就可以了。

是的,对不起,我在update语句中出错了。我已经修复了它,所以现在值从初始值更改为。这对你的解释有什么影响?没什么区别。你自己试试看:首先像你在问题中所做的那样,然后序列化(首先是会话2中的所有语句,然后是会话1中的所有语句)。您将看到这两种情况下的结果是相同的。如果我在会话2之前运行会话1,那么在会话2中读取的值将是“ccc”。相反,我会读“aaa”,没错。它并不与所有串行执行不一致,因为它与一个串行执行一致。当“Heureka”出现时,看到闪光总是很好的。非常值得努力:^)