Если пpогpаммист в 09.00 утpа уже на pаботе, значит он ещё на pаботе...
dbMain.StartTransaction;
try
spAddOrder.ParamByName('ORDER_NO').AsInteger := OrderNo;
spAddOrder.ExecProc;
for i := 0 to PartList.Count - 1 dobegin
spReduceParts.ParamByName('PART_NO').AsInteger := PartRec(PartList.Objects[i]).PartNo;
spReduceParts.ParamByName('NUM_SOLD').AsInteger := PartRec(PartList.Objects[i]).NumSold;
end;
dbMain.Commit;
except
dbMain.RollBack;
raise;
end;
Here's a translation of the text into Russian:
Код на Delphi демонстрирует работу с транзакциями в базе данных с использованием системы InterBase.
Обзор кода:
dbMain.StartTransaction; - эта строка запускает новую транзакцию.
Блок try-catch содержит код, который нужно выполнить в рамках транзакции. Если возникнут ошибки при выполнении этого кода, то блок catch будет активирован.
В блоке try:
spAddOrder.ExecProc; - эта строка выполняет хранимую процедуру с именем spAddOrder.
Цикл проходит по списку частей и уменьшает количество проданных частей для каждой части с помощью другой хранимой процедуры с именем spReduceParts.
Если возникнут ошибки при выполнении блока try, то блок catch будет активирован.
В блоке catch:
dbMain.Rollback; - эта строка откатывает транзакцию, отменяя любые изменения в базе данных, сделанные с начала транзакции.
raise; - эта строка повторно поднимает исключение, которое было поймано, чтобы оно могло быть обработано на более высоком уровне вызова.
Комментарий "Если программист уже работает в 09:00, значит он еще работает..." - это, вероятно, шутливое замечание о том, что если кто-то уже работает в 9:00 утра, то он все равно будет работать...
В отношении улучшений и предложений:
В целом, рекомендуется явно коммитить или откатывать транзакции, а не полагаться на блок try-catch для обработки ошибок.
Рассмотрите возможность добавления более конкретной обработки ошибок, например, журналирования или отображения exact error message, вместо просто повторного поднятия исключения.
Если этот код является частью более крупной программы, рассмотрите возможность использования более robust системы управления транзакциями, которая может обрабатывать несколько транзакций и.concurrent доступ.
Альтернативное решение с использованием более современного подхода к управлению транзакциями:
procedure ExecuteTransaction;
begin
dbMain.StartTransaction;
try
spAddOrder.ExecProc;
for i := 0 to PartList.Count - 1 do
begin
spReduceParts.ParamByName('PART_NO').AsInteger := PartRec(PartList.Objects[i]).PartNo;
spReduceParts.ParamByName('NUM_SOLD').AsInteger := PartRec(PartList.Objects[i]).NumSold;
end;
dbMain.Commit;
except
on E: Exception do
begin
dbMain.Rollback;
raise;
end;
end;
end;
В этом измененном коде транзакция запускается в начале процедуры и коммитится только если не возникнут ошибки. Если возникнет ошибка, то транзакция откатывается, а исключение повторно поднимается для обработки на более высоком уровне вызова.
В статье описывается пример кода на Delphi, который выполняет транзакцию, добавляя заказ и уменьшая количество проданных частей в базе данных.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.