我是否需要更高的事务隔离才能使约束在PostgreSQL中可靠地运行?

问题描述 投票:0回答:1

我有一个案例,我需要检查是否存在行,以及是否存在不再创建它。几乎总结如下:

select id from table where constraintA=$1 and constraintB=$2

紧跟在我的代码之后:

if not exist
insert into table values ($1,$2, {other data})

为了确保约束是正确的,我可以创建一个像unique(constraintA,constraintB)这样的唯一索引。

但是,在https://www.postgresql.org/docs/10/transaction-iso.html中,它表示Postgres使用行上的锁,而新创建的数据与其他并发事务隔离。所以他们不会互相阻止,因为我没有更新或删除数据。

这让我想到了我的问题,我是否需要一个高于read committed的隔离级别来确保正确性?如果没有,我的理解是否正确?

PS:我正在使用Postgres 10.5

postgresql transactions unique-constraint postgresql-9.5 isolation-level
1个回答
1
投票

您可以担心,但是您可以依赖数据库约束来按预期工作,即使面对并发事务也是如此。

约束在PostgreSQL中作为特殊触发器实现,触发器函数通过采用也将看到未提交行的新快照来“中断”MVCC。

这不在常规文件中;对于这样的主题,文档在源代码中。参见src/backend/utils/adt/ri_triggers.c,特别是this partRI_Initial_Check

© www.soinside.com 2019 - 2024. All rights reserved.