Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Работа с транзакциями

Delphi , Базы данных , База данных

Работа с транзакциями

Если п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 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
  dbMain.RollBack;
  raise;
end;

Here's a translation of the text into Russian:

Код на Delphi демонстрирует работу с транзакциями в базе данных с использованием системы InterBase.

Обзор кода:

  1. dbMain.StartTransaction; - эта строка запускает новую транзакцию.
  2. Блок try-catch содержит код, который нужно выполнить в рамках транзакции. Если возникнут ошибки при выполнении этого кода, то блок catch будет активирован.
  3. В блоке try:
    • spAddOrder.ExecProc; - эта строка выполняет хранимую процедуру с именем spAddOrder.
    • Цикл проходит по списку частей и уменьшает количество проданных частей для каждой части с помощью другой хранимой процедуры с именем spReduceParts.
  4. Если возникнут ошибки при выполнении блока try, то блок catch будет активирован.
  5. В блоке 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: База данных ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:42:42/0.0053930282592773/1