Toon posts:

[IBX, Delphi] Transaction staat steeds open

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het probleem dat steeds de transactie open blijft staan. Ik gebruik de IBX componenten. Ik heb een IBTransaction component waarbij de DefaultAction op taCommit staat. Dus hij zou de transactie zelf steeds automatisch moeten afsluiten (of je moet zelf specifiek aangeven het begin van een transactie zodat je meerdere acties in 1 transactie kan onderbrengen. Maar dat is nu niet het geval).

Zodra ik bijvoorbeeld een lijst vernieuw (dus een select query uitvoeren) staat de transactie gelijk weer open.

Dit gebeurt met deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TFormArtikelEenheid.RefreshList;
var SelectedIndex: Integer;
begin
  SelectedIndex := ListViewArtikelEenheid.ItemIndex;

  ListViewArtikelEenheid.Clear;
  FillListView;

  if ListViewArtikelEenheid.Items.Count > 0 then
  begin
    if ListViewArtikelEenheid.Items.Count >= SelectedIndex + 1 then
    begin
    ListViewArtikelEenheid.Selected := ListViewArtikelEenheid.Items[SelectedIndex];
    ListViewArtikelEenheid.ItemFocused := ListViewArtikelEenheid.Items[SelectedIndex];
    end
    else
    begin
    ListViewArtikelEenheid.Selected := ListViewArtikelEenheid.Items[0];
    ListViewArtikelEenheid.ItemFocused := ListViewArtikelEenheid.Items[0];
    end;
  end
  else
  begin
    edt_Afkorting.Text := '';
    edt_Omschrijving.Text := '';
  end;
  UpdateToolButtons;
end;

Deze procedure roept de FillListView aan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TFormArtikelEenheid.FillListView;
var Line: TListItem;
begin
  dtModule.IBQueryArtikelEenheid2.Active := False;
  with dtModule.IBQueryArtikelEenheid2.SQL do
  begin
    Clear;
    Add(' SELECT EENHEIDID, EENHEIDAFKORTING, EENHEIDOMSCHRIJVING ' +
      ' FROM   ARTIKELEENHEID ');
  end;

  try
    dtModule.IBQueryArtikelEenheid2.Open;
    dtModule.IBQueryArtikelEenheid2.First;
  except
    on E: EIBError do
    begin
    Exit;
    end;
  end;

  ListViewArtikelEenheid.Items.BeginUpdate;
  with dtModule.IBQueryArtikelEenheid2 do
  begin
    while (not EOF) do
    begin
    Line := ListViewArtikelEenheid.Items.Add;
    Line.Caption := FieldByName('EENHEIDAFKORTING').AsString;
    Line.SubItems.Add(FieldByName('EENHEIDOMSCHRIJVING').AsString);
    Line.SubItems.Add(InttoStr(FieldByName('EENHEIDID').AsInteger));
    Next;
    end;
  end;
  ListViewArtikelEenheid.Items.EndUpdate;
end;

Weet iemand waarom die transactie niet gelijk automatisch wordt afgesloten?

Verwijderd

Topicstarter
Niemand?

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:42
Wat doe je eigenlijk in die transactie? Enkel een SELECT?

Transacties zijn niet echt van toepassing op SELECT's, maar eerder op statements die de data echt gaan manipuleren ipv raadplegen. INSERT, UPDATE's en DELETE's dus.

Mbhv een transactie kan je er nl. voorzorgen dat de gedane wijzigingen binnen de transactie 'atomic' zijn; ofwel worden ze allemaal doorgevoerd, ofwel wordt er geen enkele uitgevoerd. Dit zorgt ervoor dat de data in de databank consistent/niet corrupt blijft.

Ik zie dus niet echt het nut in om enkel een select-statement in een transactie te zetten.

En aangezien er nergens iets naar de database gepost wordt, zal de transactie dus ook nooit gecommited (of gerollbacked) worden, en blijft ze dus pending.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ja ik weet wat een transactie is en waarvoor die bedoeld is.

Maar bij een IBQuery component moet je dus verplicht een IBTransaction component gebruiken.

Voordat ik de procedure RefreshList uitvoer is de IBTransaction niet open. Zodra ik de procedure uitgevoerd heb (die inderdaad dus alleen die select uitvoert), dan is de IBTransaction opeens open.

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 09-09 12:09

Delphi32

Heading for the gates of Eden

Ik moest ff drie keer lezen voor ik begreep wat je bedoelde maar ik denk dat ik het zie.
Een Interbase Transaction is iets meer dan een gewone transaction, die je normaal gesproken nodig hebt als je updates uitvoert. De IB Transaction is in feite een soort van vastlegging van het moment waarop je de database benadert (dus ook met de query); het is de 'versie' van de database waar jouw applicatie mee praat. De staat van de database, zo je wilt.
Ok nu je probleem: als ik je goed begrijp wil je bij elke refresh van je list altijd de meest recente gegevens hebben (logisch :) ). Heb je 2 mogelijkheden: 1. transactie zelf weer sluiten in jouw blokje code, 2. spelen met de IdleTimer property. Die staat meen ik standaard op 0. Jouw DefaultAction van taCommit is correct, maar deze wordt pas uitgevoerd als de IdleTimer bereikt is. Is deze 0, dan zal die nooit getriggerd worden. Zet deze dus eens op 1 of zo. Volgens mij gaat dat helpen.

Verwijderd

Topicstarter
Nou ik denk dat ik dan zelf maar handmatig de transactie ga commit'n (dus sluiten) na een SELECT.

Maar ik blijf het heel onlogisch vinden dat na een SELECT de transactie opengezet wordt.


Trouwens nog een vraagje:

Wat is er dan beter om te doen:

- RollBack
- Commit

In princiepe wordt er geen data opgeslagen. Dus als je dat 100% zeker weet, is het dan slimmer om te rollback'n of maakt het weinig uit?

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 09-09 12:09

Delphi32

Heading for the gates of Eden

Op woensdag 01 mei 2002 18:32 schreef tokkie het volgende:
Trouwens nog een vraagje:

Wat is er dan beter om te doen:

- RollBack
- Commit

In princiepe wordt er geen data opgeslagen. Dus als je dat 100% zeker weet, is het dan slimmer om te rollback'n of maakt het weinig uit?
Uit veiligheidsoverwegingen (dat heet geloof ik defensief programmeren en daar zijn ze bij mij op mn werk nogal fan van) kies je dan voor de Rollback. Dat betekent dan zoiets als: dit stukje van mij is niet geacht data te posten, laat staan te committen. Mocht dat in de toekomst toch nodig zijn, dan moet men dus bewust de Rollback verwijderen en dat zorgt er dan weer voor dat mensen zich beter bewust zijn van wat ze doen :z
Pagina: 1