Состояние гонки при запросе к многораздельной таблице в PostgreSQL?
Предполагая PostgreSQL 10.3 и Read Committed: вводит ли запрос по разделенной таблице условие состязания в случае, если один из разделов был изменен другим процессом?
Например, учитывая эту схему:
CREATE TABLE foo (
id VARCHAR,
state VARCHAR
) PARTITION BY LIST(state);
CREATE TABLE foo_pending PARTITION OF foo FOR VALUES IN ('pending');
CREATE TABLE foo_ready PARTITION OF foo FOR VALUES IN ('ready');
Допустим, у меня есть один процесс, который запрашивает:
SELECT * FROM foo WHERE id = 'something';
И еще один процесс:
BEGIN TRANSACTION;
DELETE FROM foo_ready WHERE id = 'something';
INSERT INTO foo_pending VALUES ('something', 'pending');
COMMIT;
Возможно ли, что первый процесс не находит подходящих строк в разделе foo_pending
(потому что он был получен до того, как другой процесс завершен), а также нет соответствующих строк в foo_ready
(потому что он получен после того, как другой процесс совершил)?
Нужно ли мне SERIALIZABLE
(или же REPEATABLE READ
) чтобы побороть эту проблему?