172 похожих чатов

Господа, доброе утро! Подскажите пожалуйста, можно ли в рамках одной

транзакции залочить запись на чтение (заставить ждать) или же как иначе мой кейс решается ?
У меня есть кейс что в 1 транзакции одна и та же запись выбирается и делается перезаписывание значения на основе текущего. И получается если получить запись одновременно и обновить её позже то результатом будет то, что выполнится последним

P.S. на скрине ошибка, select должен выполняться for update, но это роли не сыграет

По моей логике если мы выполняем запрос for update,то пока не выполнится обновление она не может быть прочитана

11 ответов

17 просмотров

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

Evgeniy- Автор вопроса
Phil Chertiev
могу лишь сказать, что по логике postgres писатели...

Чистый пример транзакции. Мы делаем выборку записи и имеем на этот момент значение 500. Далее +/- 100 и в итоге ожидаем что значение будет 500, а оно 400 по последнему update

Evgeniy- Автор вопроса
Владислав Гайденко
А где происходит +/- 100?

Внешне, в коде. На основе наших первых select

Evgeniy
Чистый пример транзакции. Мы делаем выборку записи...

При обновлении значение колонки может быть не только значением но и выражением value = value + 100

Evgeniy- Автор вопроса
ilia kologrivov
При обновлении значение колонки может быть не толь...

Хорошо. А если это строка ? value = 'emilly', потом value = 'may'

Evgeniy
Чистый пример транзакции. Мы делаем выборку записи...

Как вы ожидаете +100 и -100 если присваиваете явное значение????

Evgeniy- Автор вопроса
Konstantin Zaitsev
Как вы ожидаете +100 и -100 если присваиваете явно...

Я же говорю, в запросе ошибки нет. Ошибка в логике работы с ней. Мы в коде инкрементируем это значение надеясь что при select будет актуальное. В нашем случае мы выполнили +100 и value стал 600, мы ожидаем что второй запрос будет иметь начальным 600 и мы от туда вычтем 100

Evgeniy- Автор вопроса
Konstantin Zaitsev
Так и почему не написать set value = value +100?

Я понял что с цифрами плохой пример

Evgeniy
Чистый пример транзакции. Мы делаем выборку записи...

А зачем вы при таких блокировках выбираете запись, которую будете обновлять — и без FOR UPDATE? Не делайте так. (А ещё лучшэ — поставьте transaction isolation level serializable и не мучайтесь пока с ручными блокировками).

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта