Состояние гонки при запросе к многораздельной таблице в 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) чтобы побороть эту проблему?

0 ответов

Другие вопросы по тегам