powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Согласованность значений переменных до и после UPDATE внутри функции
14 сообщений из 14, страница 1 из 1
Согласованность значений переменных до и после UPDATE внутри функции
    #39144316
Арктур Менгск
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простой, казалось бы вопрос.
Перед тем как изменить баланс на аккаунте, я запоминаю значение баланса (до его изменения) в переменную v_a1
Также записываю в переменную v_a2 значение баланса, которое должно получиться.
После изменения баланса считываю его изменившееся по факту значение в v_a3.
Вопрос - может ли быть такое , что v_a2 не равно v_a3 ?
(т.е. попадём ли мы в блок обработки ошибки с кодом = 4 ?)

Эта функция будет запускаться одновременно с разных компов многими юзерами, изменяющими один и тот же баланс (одинаковый i_id_balance)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION f_user_change_balance 
 .....................................
BEGIN
 .....................................
        
	SELECT balance INTO v_a1 FROM t_balance WHERE id = i_id_balance;

	v_a2 :=  v_a1 + v_dx;
  
        ----------------------------------------------------------------------------------------
        UPDATE t_balance SET balance = balance + v_dx WHERE id = i_id_balance RETURNING balance INTO v_a3 ;
        ----------------------------------------------------------------------------------------
        
        IF NOT (v_a2 = v_a3)
         THEN
                 o_code := 4; o_message := 'Ошибка при проверке итогового значения баланса.';
                 RETURN;
        END IF;
  
 .....................................     
	
END;
$$  LANGUAGE plpgsql     SECURITY DEFINER;
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39144321
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Арктур Менгск,

Может. Такая аномалия называется “nonrepeatable read”. Почитайте про уровни изоляции.
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39144470
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Арктур МенгскПростой, казалось бы вопрос.
Перед тем как изменить баланс на аккаунте, я запоминаю значение баланса (до его изменения) в переменную v_a1

-- а зачем вы
это делаете ?

Арктур МенгскТакже записываю в переменную v_a2 значение баланса, которое должно получиться.

-- а зачем вы
это делаете ?

Арктур МенгскПосле изменения баланса считываю его изменившееся по факту значение в v_a3.

-- а зачем вы
это делаете ?

Арктур МенгскВопрос - может ли быть такое , что v_a2 не равно v_a3 ?
(т.е. попадём ли мы в блок обработки ошибки с кодом = 4 ?)

-- если вас интересует, будет ли в read commited честный инкрементальный бекап -- да, будет.

будет ли при этом соблюдаться repeatable--read по балансу )если вы не смените сами уровень изоляции) -- нет, не будет.

или смените сами уровень изоляции
Код: sql
1.
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;



или делайте
Код: sql
1.
SELECT balance INTO v_a1 FROM t_balance WHERE id = i_id_balance FOR UPDATE;


-- и имейте очередь, вместо ошибок изоляции.

или интересуйтесь чем то вида
Код: sql
1.
2.
UPDATE t_balance SET balance = balance + v_dx WHERE id = i_id_balance RETURNING balance, balance - v_dx INTO v_a3, v_a1  ;
        ------


-- но тогда сравнение теряет смысл -- инкрементирование атомарно.

т.е. если делта у вас исчисляется в зависимости от величины текущего баланса -- то надо либо лочить (в тот момент, где впервые вяжетесь на величину) либо сменить уровень изоляции.
если не зависит -- сама постановка задачи излишня -- т.к. инкрементирование атомарно (на нем -- очередь возникает-- все с номерами от 2 и выше ждут коммита первого -- до того как им отдадут запись на растерзание).
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39144477
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq-- если вас интересует, будет ли в read commited честный инкрементальный бекап -- да, будет.

эхолалия детектид

читать "UPDATE".
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146047
Арктур Менгск
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqили смените сами уровень изоляции
Код: sql
1.
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;


Заодно не подскажете, можно ли использовать эту конструкцию внутри функции (на языке PLPGSQL) ?
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146059
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Арктур Менгскqwwqили смените сами уровень изоляции
Код: sql
1.
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;


Заодно не подскажете, можно ли использовать эту конструкцию внутри функции (на языке PLPGSQL) ?никак
от слова "совсем"


читайте, и обрящете
http://www.postgresql.org/docs/current/static/sql-begin.html
http://www.postgresql.org/docs/9.5/static/transaction-iso.html
...
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146191
Арктур Менгск
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqникак
от слова "совсем" а тогда как применить ваш совет, вы же видите что я пишу именно функцию ?
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146199
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Арктур Менгскqwwqили смените сами уровень изоляции
Код: sql
1.
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;


Заодно не подскажете, можно ли использовать эту конструкцию внутри функции (на языке PLPGSQL) ?
у тебя неправильно делается твоя проверка. Она вообще бессмысленная. Выкинь её.
Оставь один апдейт в функции и живи спокойно
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146232
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Арктур Менгскqwwqникак
от слова "совсем" а тогда как применить ваш совет, вы же видите что я пишу именно функцию ?
прости, мальчек
я думал ты решаешь проблему
а ты просто пописать вышел, функцею
абазнался
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146239
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan DurakАрктур Менгскпропущено...

Заодно не подскажете, можно ли использовать эту конструкцию внутри функции (на языке PLPGSQL) ?
у тебя неправильно делается твоя проверка. Она вообще бессмысленная. Выкинь её.
Оставь один апдейт в функции и живи спокойно
он может исчислять дельту, как F(текущего балланса) -- тогда ему самому надо организовывать очередь в точке .где _вычитывается_ текущий баланс для определения дельты, а не ждать, пока очередь возникнет сама, в точке, где этот баланс изменяется .

если же дельта не зависит ни от чего -- то то, что он делает лишние движения тазовой костью ему давно рассказали -- но оно не вкуривает. ибо нечем. печалька.
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146345
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqIvan Durakпропущено...

у тебя неправильно делается твоя проверка. Она вообще бессмысленная. Выкинь её.
Оставь один апдейт в функции и живи спокойно
он может исчислять дельту, как F(текущего балланса) -- тогда ему самому надо организовывать очередь в точке .где _вычитывается_ текущий баланс для определения дельты, а не ждать, пока очередь возникнет сама, в точке, где этот баланс изменяется .

если же дельта не зависит ни от чего -- то то, что он делает лишние движения тазовой костью ему давно рассказали -- но оно не вкуривает. ибо нечем. печалька.
я его насквозь вижу с помощью хрустального шара - дельту он там не считает.
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146346
Арктур Менгск
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
ты не понял, мне нужно вывести юзеру инфу - с какого значения и на какое именно значение он изменил баланс своей транзакцией
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146355
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Арктур Менгск с какого значения и на какое именно значение он изменил баланс своей транзакциейлинейные уравнения с одной неизвестной проходят в младших классах средней школы. решение не определено только для случая умножения на 0.
если не учился в школе на арифметика и где-нибудь не в школе на sqlника, почитай про селект фор упдате.
но в более сложных случаях (инсерт) оно не поможет.
...
Рейтинг: 0 / 0
Согласованность значений переменных до и после UPDATE внутри функции
    #39146360
Арктур Менгск
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.линейные уравнения с одной неизвестной проходят в младших классах средней школыя где-то писал, что не знаю как решить линейное уравнение с одной неизвестной?
я всего лишь объяснял, почему нужно получить величину баланса сразу после UPDATE
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Согласованность значений переменных до и после UPDATE внутри функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]