Postgresql仅根据特定的提交顺序使多个并发事务中的一个事务失败

时间:2019-07-11 00:40:41

标签: postgresql transactions serializable database-concurrency

我使用Postgres可序列化模式,发现一些提交顺序使事务失败,但是在提交顺序不同的情况下不会使事务失败。

对于下面的代码,我同时运行每个事务,但是逐步执行每个事务,因此我启动tx 1并完成其所有操作,然后完成tx 2和其所有操作,然后再执行tx 3但是,每次继承之后我都不会提交。在所有TX上的所有操作完成后,我便开始提交。

表声明:

drop table if exists si_test;
create table si_test (name text unique, num integer);

insert into si_test values('a',10);
insert into si_test values('b',20);
insert into si_test values('c',30);

交易:

T1: begin transaction isolation level serializable;
T1: update si_test set num=45 where name='a';

T2: begin transaction isolation level serializable;
T2: select * from si_test where name='a'; -- -> this shows value 10
T2: update si_test set num=47 where name='b';

T3: begin transaction isolation level serializable;
T3: select * from si_test where name='b'; -- -> this shows value 20

这是我的提交顺序和结果:

T1 -> T3 -> T2 : T2 serialization error
T1 -> T2 -> T3 : T2 serialization error
T2 -> T1 -> T3 : all committed
T2 -> T3 -> T1 : all committed
T3 -> T1 -> T2 : all committed
T3 -> T2 -> T1 : all committed

从这些查询中,我可以说有一个可序列化的时间表T3-> T2-> T1。我在postgres SSI文档中读到,他们检查了2个“危险结构/ rw依赖关系”,以得出一些并发事务是否违反可序列化时间表的结论,而从我的测试来看,应该不会。

我检查了EXPLAIN ANALYZE,它表明我的实例正在使用索引扫描来满足where子句

我的问题是:有人可以解释实际情况吗?我的考试成绩在哪里?

注意:在Windows 10 Pro上的Postgres 11.2上测试运行

注意2:这3个TX同时运行在3个不同的连接上

0 个答案:

没有答案