提交与提交保留

Commit vs CommitRetaining

我做了一个 Delphi 应用程序,它向 Firebird 数据库中插入一行。 通过 CommitRetaining 解决了一个查询的问题,但我读到使用它是不正确的,因为它可能会影响服务器变得更慢。当我仅使用 Commit 时会发生奇怪的事情,查询运行正常,但是当我想查看是否插入了该行时,Retainingit 却没有。它只会在应用程序终止时插入。但是当使用 CommitRetaining 时,该行会立即插入。

可能导致问题的原因是什么? 编辑:使用 CommitRetaining

的代码
             adqPom := TADQuery.Create(nil);
             adqPom.Connection := form1.ADOConnection1;
             adTransakcija := TADTransaction.Create(nil);
             adTransakcija.Connection:=form1.ADOConnection1;
             adqPom.Transaction:=adTransakcija;
             adTransakcija.StartTransaction;
             try
               with adqPom do
               begin
                 close;
                 sql.Clear;
                 sql.Add('insert into uplate(sifra,b_prijema,magacin,datum,iznos,b_uplate,b_izvoda,banka,godina,tr_rac,datum_dokument)');
                 sql.Add('values(:S,:BP,:M,:D,:I,:BU,:BI,:B,:G,:TR,:DD)');
                 ParamByName('S').Value := strtoint(edit1.Text);
                 if Form15.adoqDostavn.FieldValues['A1'] = 3 then
                     edit3.Text := '99999';
                 ParamByName('BP').Value := edit3.Text;
                 ParamByName('M').Value := edit2.Text;
                 ParamByName('D').Value := strtodate(edit4.Text);
                 ParamByName('I').Value := StrToFloat(edit5.Text);
                 ParamByName('BU').Value := Br_Uplate+1;
                 ParamByName('BI').Value := strtoint(Edit6.Text);
                 ParamByName('B').Value := Edit8.Text;
                 ParamByName('G').Value := 2006;
                 if Form15.adoqDostavn.FieldValues['A1'] = 3 then
                   ParamByName('TR').Value:= form15.adoqDostavn.FieldValues['B_PRIJEMA']
                 else
                   ParamByName('TR').Value:= Form15.adoqDostavn.FieldValues['B_DOST'];
                 ParamByName('DD').Value:=StrToDate(edit9.Text);
                 ExecSQL;
               end;
               adTransakcija.CommitRetaining;
             except
               adTransakcija.RollbackRetaining;
               raise;
             end;
             FreeAndNil(adTransakcija);
             FreeAndNil(adqPom);

编辑:使用提交的代码(实际上 属性 查询设置为自动提交)

               adqPom := TADQuery.Create(nil);
               adqPom.Connection := form1.ADOConnection1;
               with adqPom do
               begin
                 close;
                 sql.Clear;
                 sql.Add('insert into uplate(sifra,b_prijema,magacin,datum,iznos,b_uplate,b_izvoda,banka,godina,tr_rac,datum_dokument)');
                 sql.Add('values(:S,:BP,:M,:D,:I,:BU,:BI,:B,:G,:TR,:DD)');
                 ParamByName('S').Value := strtoint(edit1.Text);
                 if Form15.adoqDostavn.FieldValues['A1'] = 3 then
                     edit3.Text := '99999';
                 ParamByName('BP').Value := edit3.Text;
                 ParamByName('M').Value := edit2.Text;
                 ParamByName('D').Value := strtodate(edit4.Text);
                 ParamByName('I').Value := StrToFloat(edit5.Text);
                 ParamByName('BU').Value := Br_Uplate+1;
                 ParamByName('BI').Value := strtoint(Edit6.Text);
                 ParamByName('B').Value := Edit8.Text;
                 ParamByName('G').Value := 2006;
                 if Form15.adoqDostavn.FieldValues['A1'] = 3 then
                   ParamByName('TR').Value:= form15.adoqDostavn.FieldValues['B_PRIJEMA']
                 else
                   ParamByName('TR').Value:= Form15.adoqDostavn.FieldValues['B_DOST'];
                 ParamByName('DD').Value:=StrToDate(edit9.Text);
                 ExecSQL;
               end;
               FreeAndNil(adqPom); 

提交释放事务环境,CommitRetaining 是一个不释放事务环境的提交(游标仍然打开)。您可以在进程中使用 CommitRetaining,但最后必须使用 Commit 释放内存。

通常使用CommitRetainning来优化一个进程(其中包含大量Begin/Commit),但最后必须使用Commit清理内存。