#database #postgresql #hibernate
Вопрос:
Я создал следующую процедуру для перевода средств между двумя кошельками:
create or replace procedure transfer(
sender int,
receiver int,
amount bigint
)
language plpgsql
as $
DECLARE balance_var INT DEFAULT 0;
BEGIN
select balance
into balance_var
from public.wallets
where id = sender for update;
IF balance_var < amount THEN
raise exception 'Account has no enough balance: %', balance_var;
end if;
-- creating a transaction for sender
insert into transactions (amount, source_id, destination_id, description, status, trx_type)
values (-amount, sender, receiver, 'transfer', 'COMPLETED', 'transfer');
-- creating a transaction for receiver
insert into transactions (amount, source_id, destination_id, description, status, trx_type)
values (amount, sender, receiver, 'transfer', 'COMPLETED', 'transfer');
-- subtracting the amount from the sender's account
update wallets
set balance = balance - amount
where id = sender;
-- adding the amount to the receiver's account
update wallets
set balance = balance amount
where id = receiver;
COMMIT;
END;$
У меня есть три вопроса:
- Нужно ли мне блокировать вторую учетную запись перед проверкой баланса?
- Какие проблемы могут возникнуть при использовании этой процедуры?
- Что имеет больше преимуществ: процедура написания или написание запроса на уровне приложения (например: использование режима гибернации)