Я использую MySQL, и я знаю, что вложенное соединение не разрешено - используйте «save points» для этого, но я хотел бы создать более общий код, который также можно использовать с другими СУБД.Как правильно начать, работать и завершить транзакцию?
Итак, я хотел бы знать, как правильно начать, работать и завершить транзакцию в коде ниже?
После ExampleDAO.Save()
функция может быть использована внутри другой функции, например OtherExampleDAO.Save()
.
Строки с верификацией if Assigned(dbTransaction) then
всегда возвращают true, поэтому как правильно проверить, был ли создан экземпляр dbTransaction
?
function TExampleDAO.Save(const Example: TExample): Boolean;
var
dbxTransaction: TDBXTransaction;
begin
if Assigned(Example) then // prevents invalid object, like ExampleDAO.Save(nil);
begin
try
if (_connection.TransactionsSupported) AND
((not _connection.InTransaction) OR (_connection.MultipleTransactionsSupported)) then
begin
dbxTransaction := _connection.BeginTransaction(TDBXIsolations.ReadCommitted);
end;
try
// example
_sqlQuery.Close;
_sqlQuery.SQL.Clear;
_sqlQuery.SQL.Add('INSERT INTO example(a, b) '
+ 'VALUES(:a, :b)');
_sqlQuery.ParamByName('a').AsAnsiString := Example.A;
_sqlQuery.ParamByName('b').AsDateTime := Example.B;
_sqlQuery.ExecSQL(False);
// example info
_sqlQuery.Close;
_sqlQuery.SQL.Clear;
_sqlQuery.SQL.Add('INSERT INTO example_info(c, d) '
+ 'VALUES(:c, :d)');
_sqlQuery.ParamByName('c').AsInteger := Example.Info.C;
_sqlQuery.ParamByName('d').AsFloat := Example.Info.D;
_sqlQuery.ExecSQL(False);
if Assigned(dbxTransaction) then
_connection.CommitFreeAndNil(dbxTransaction);
Result := True;
except
on Exc:Exception do
begin
if Assigned(dbxTransaction) then
_connection.RollBackFreeAndNil(dbxTransaction);
raise Exc;
Result := False;
end;
end;
finally
if Assigned(dbxTransaction) then
FreeAndNil(dbxTransaction);
end;
end
else
begin
Result := False;
end;
end;
'Результат: = False;' после 'raise' бесполезен. Я бы поднял «EArgumentNilException», если «Example» не назначен и превратил его из функции в процедуру –
http://stackoverflow.com/questions/8548843/why-should-i-not-use-if-assigned- до использования или освобождения вещей –
Присвоение результата бесполезно перед рейзом! –