Могу ли я рассчитывать на то, что каждый оператор обновления в postgresql является атомарным? - PullRequest
0 голосов
/ 28 февраля 2019

Я прочитал некоторые материалы, прежде чем сказать, что каждый оператор обновления в postgresql является атомарным.

Например,

update set column_1 = column_1 + 100 where column_2 = 10;

Даже если у меня несколько процессов, вызывающих обновление одновременно, я могу положитьсяна этом, что они будут происходить в последовательности, потому что каждое обновление атомарно позади сцены, и цикл "read_modify_write" инкапсулирован в пакет.

Однако, что, если оператор обновления выглядит следующим образом:

update set column_1 = myFunction(column_1) where column_2 = 10;

Здесь myFunction () - это хранимая процедура, созданная мной. В этой функции я буду применять различные математические операции к column_1 в зависимости от ее количества.Что-то вроде:

    if(column_1 < 10):
            // do something
    else if (column_1 < 20):
            // do something
    else
            // do something

В этом случае, когда один оператор обновления содержит самоопределяемую функцию, он остается атомарным?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

update, подзапросы и запросы в вызовах функций должны видеть согласованное представление данных.

С Глава 13. Управление параллелизмом .

Внутренне согласованность данных поддерживается с помощью многоверсионной модели (Multiversion Concurrency Control, MVCC). Это означает, что каждый оператор SQL видит моментальный снимок данных (версию базы данных), как это было некоторое время назад, независимо от текущего состояния базовых данных. Это предотвращает несогласованный просмотр операторовданные, полученные параллельными транзакциями, выполняющими обновления в одних и тех же строках данных, обеспечивающими изоляцию транзакций для каждого сеанса базы данных.

Я полагаю, что это означает, что для каждого оператора Postgres хранит версию данных.Каждый оператор видит непротиворечивую версию базы данных на протяжении всего ее выполнения.Это включает в себя подзапросы и вызовы функций.

Это не означает, что вам не нужно думать о параллелизме.Это просто означает, что update увидит непротиворечивые данные.

0 голосов
/ 01 марта 2019

Хорошо, @ Шверн знает, что такое Perl, мирового уровня, но что касается транзакций PostgreSQL, я могу исправить его: -)

Каждый оператор в PostgreSQL выполняется внутри транзакции, либо явный, который вы НАЧИНАЕТЕ/ СОВЕРШИТЕ себя или неявное завертывание утверждения.Во время выполнения оператора вы увидите стабильное представление всей базы данных.

Если вы напишите myFunction как пользовательскую функцию в базе данных в pl / pgsql или что-то подобное, то она тоже будет вта же транзакция, что и оператор, который ее вызывает.Если он не запускает свои собственные запросы, а просто работает со своими параметрами, тогда вам не нужно больше думать.

Если вы читаете из таблиц в своей функции, вам понадобится проходное знакомство с уровни изоляции транзакций .В частности, убедитесь, что вы понимаете, что означает «зафиксированное чтение» при просмотре действий других процессов.

В статье блога, на которую вы ссылаетесь, обсуждается выполнение операций за пределами базы данных .Предлагаемое решение - именно то, о чем вы спрашиваете - атомное обновление.

...