可序列化隔离模式可用于在插入相等的 id 时避免竞争条件。因此,create table u(uid int primary key, name text);
如果我们运行两个类似的事务 T1 和 T2:
begin isolation level serializable;
select * from u where uid = 1;
然后继续 T1 和 T2:
insert into u (uid, name) values (1, 'A');
只有第一个成功commit;
,而另一个引发序列化失败。
这是该模式的一个非常简洁的功能,可以处理复杂交易中的唯一密钥违规,而不是诉诸特定的“黑客” insert ... on conflict
。但是,即使 uid 不同,例如uid = 2
and uid = 3
,事务 T1 和 T2仍然无法提交。
怎么可能?假设他们创建不同的谓词 SIReadlocks 并select
使用索引扫描。诀窍在哪里?