sql - Postgres Serialized 似乎不像描述的那样工作

标签 sql postgresql concurrency transactions serializable

我是 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 上执行...

--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.

因为对第 4 行排序 session 1 然后 2 与排序 2 然后 1 会产生不同的结果。

我不明白什么?

最佳答案

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

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

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

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

关于sql - Postgres Serialized 似乎不像描述的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59274013/

相关文章:

mysql - 检测数据何时更改

sql - 选择日期为工作日的行

database - 在 postgresql 中同一数据库的模式之间有效地移动数据

postgresql - 第一次和第二次出现在 PostgreSQL 中的行 ID

Java CountDownLatch 不解锁?为什么最后一行不打印?

java - 寻找等待对象

python - django.db.utils.IntegrityError : The row in table 'main_page_projects' with primary key '1' has an invalid foreign key 错误

sql - 在Rails中查询sqlite哈希列

database - 数据库如何在更快的磁盘上获得更差的基准测试结果?

multithreading - Go运行时使用的线程数