2014-09-03 1 views
0

Я не уверен, написал ли я это правильно.Действительно ли транзакция выполнена правильно в этом запросе?

procedure TMainForm.AdvGlowButton1Click(Sender: TObject); 
begin 
DataModule2.INS_Query.Close; 
DataModule2.INS_Query.SQL.Clear; 
DataModule2.FDTransaction1.StartTransaction; 
try 
if cxlookupcombobox1.Text ='' then begin 
.... 
.... 
DataModule2.INS_Query.ExecSQL; 
DataModule2.FDTransaction1.Commit; 
end else begin 
if cxlookupcombobox1.Text <>'' then 
...... 
...... 
DataModule2.INS_Query.ExecSQL; 
DataModule2.FDTransaction1.Commit; 
end; 
except 
on e: exception do begin 
Showmessage(format('Error occured. Error is: %s',[e.message])); 
DataModule2.FDTransaction1.Rollback; 
DataModule2.MYTABLE.Cancel; 
end; 
end; 

Выполняет все правильно, но что-то меня злит.

DataModule2.FDTransaction1.Commit;

Должно ли быть совершено дважды? Или я правильно написал этот запрос?

+0

В коде, который вы показываете, вы можете выполнить только один 'DataModule2.FDTransaction1.Commit'. Либо внутри основного предложения 'if', либо внутри предложения' else'. Во всяком случае, кажется немного странным, что первое условие в предложении 'else' такое же, как в главном предложении' if'. Это настоящий код? –

+0

Да, это реально и выполняется нормально, насколько я могу судить – user3927897

ответ

3

№ Обязательно только один раз для начатой ​​транзакции. Как правило, построение кода в псевдокоде выглядит следующим образом:

Transaction.Start; 
try 
    Query.Execute; 
    Query.Execute; 
    ... 
    Transaction.Commit; 
except 
    Transaction.Rollback; 
    raise; 
end; 

И поскольку вы совершали только один раз, ваш код кажется правильным в этой манере.

+0

Вы должны добавить 'рейз;' после откат, чтобы получить информацию, почему: o) –

+0

@SirRufo, мой псевдоязык не поддерживает повторные воссоздания исключений :-) – TLama

+0

Обработка исключений OP показывает сообщение - плохая идея. Получение нового исключения или просто повторение оригинала - способ справиться с этим, и приложение покажет сообщение. –