Обновляется ли выбранный атоми c для READ_COMMITED в postgres? - PullRequest
1 голос
/ 25 марта 2020

Является ли следующий запрос атома c в транзакции READ_COMMITED?

update my_table
 set
   owner = ?,
 where id = (
   select id from my_table
   where owner is null
   limit 1
 ) returning *

Я запускаю тесты на локальном экземпляре postgres, и кажется, что это атоми c, но всегда ли это так?

1 Ответ

0 голосов
/ 25 марта 2020

Каждый оператор SQL на уровне изоляции READ COMMITTED делает снимок базы данных, поэтому он и все его подзапросы видят согласованную версию базы данных.

Но вы не защищены от «потерянных обновлений» ”: Возможно, что параллельная транзакция изменяет строку между началом оператора и временем обновления строки, поэтому может случиться так, что для строки, которая фактически обновлена, owner не будет больше присвоено значение NULL.

Если вам нужно этого избежать, добавьте в подзапрос предложение FOR UPDATE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...