我当前正在运行 PostgreSQL 13,但也在 PostgreSQL 11 中观察到了这种行为。我遇到了引发 UniqueConstraint 违规错误的问题,但我希望在pg_advisory_xact_lock
提交事务之前会阻塞(并且对等待的其他事务可见)上锁)或回滚。
我正在sort_id
根据 Web 应用程序中表中的外键计算表中行的唯一性。UniqueConstraint(sort_id, foreign_key_value)
。pg_advisory_xact_lock
我们通过 SQL Alchemy 和 psycopg2 在 Python 中使用。最初,这是基于 SQL Alchemy 模型计算的(请参阅模型属性中最新的 sort_id)。我也尝试过像 ( ) 这样的直接查询,SELECT max(sort_id) from table where foreign_key_value=:value;
但仍然遇到约束错误。
随着此 API 调用/功能的并发性增加,约束错误率也会增加。运行单线程,我们永远不会遇到约束错误。这让我相信锁可能会在数据对其他事务可见之前被释放。
什么时候pg_advisory_xact_lock
发布?在不同进程获取锁之前,数据对其他事务是否可见?
据记载:
不必要。例如,在“可重复读”隔离级别下,“另一个”事务在其启动时间看到数据,因此如果“第一个”事务在“另一个”启动之后提交,后者可能看不到“另一个”事务的结果第一的”。