такой транзакции
select count(*) from users where id=5;
insert into users (id, ...) values(5, ...)
То есть нужна гарантия, что между select и insert, другая транзакция не добавит юзера с id 5.
Вроде как count всегда вернёт 1 либо 0, то есть select for share / non repeatable read isolation должно хватит.
Но count при этом является аггрегативной функцией, которая не работает с 1 записью. Получается, что в таком случае поможет только serializable isolation level?
В практически то какая задача? В вашем примере проще exception обработать
Да задача простая, создать пользователя. Можно и обработать, и не писать select даже. Но хорошее ли это решение?
Хорошее добавить последовательность и забыть
То есть serializable level?
GENERATED ALWAYS AS IDENTITY для id В insert добавить returning и получить значение.
В моем случае я получаю из вне id с другой бд, поэтому здесь генерация не нужна
Зачем тогда проверяете ?
у вас в users поле id - это primary key должно быть, сделайте insert on conflict do nothing или в чем тут проблема?
Мне нужна информация, о том, получилось ли добавить или нет, воопщем просто обработаю тогда ошибку
Обсуждают сегодня