[IB] Problem z tranzakcjami

0

Witajcie

Mam następujący problem:

Do komponenty ibdatabase podłączyłem ibtransaction. Wszystko śmiga do momentu wywołania IBTransaction.StartTransaction; Wywala mi się wtedy komunikat 'Transaction is active'. Dziwne w tym wszystkim jest to że ten błąd wywala się zawsze nawet jak zaraz przed dam rollback albo commit.

Ktoś już się z tym spotykał?

0

Głowiłem się długo i chyba rozwikłałem zagadkę, więc napisze dla potomnych jak to działa (bo ciężko cokolwiek o tym w sieci znaleźć).

Kiedy w komponencie IBDATABASE ustawimy jako DeofultTransaction jakiś komponent IBTRANSACTION, to w w momencie połączenia z bazą ustanawiana jest transakcja kutra trwa nieprzerwanie. Gdy chcemy zatwierdzić zmiany lub cofnąć wszystko co nie zostało zatwierdzone wystarczy wywołać w komponencie IBTRANSACTION CommitRetaining lub RollbackRetaining. W przciwieństwie do tego co podają książki (np Pana Gawrońskiego) nie trzeba pisać:

if not InTransaction then
IBTRANSACTION.StartTransaction;

Ponieważ transakcja trwa od czasu połączenia się z bazą.

Sytuacja jest identyczna kiedy IBTRANSACTION jest podłączone do DataSeta, transakcja trwa od momentu

DATASET.Active := true;

.

0

To chyba nie dokońca tak. DefaultTransaction to ten który jest ustawiany w nowo kładzionych komponentach (IBDataset'ach). Trwa tyle ile zdecyduje o tym użytkownik. To że po podłączeniu ustawia Ci się na True może wynikać z jakichś otwartych datasetów. Transakcje powinny zawsze trwać jak najkrócej.
Co do dataset'a to OK, jak go otworzysz to on sam sobie otworzy transakcję. Trzeba jednak zwrócić uwagę na ustawienie (nie pamiętam dokładnie) AutoStopAction przy IBDatabase. Generalnie zawsze powinno się to robić jawnie, chyba że są to pierdoły robione w jednym datasecie:

StartTransaction
try
....
Commit
except
Rollback
end;

A sprawdzać InTransaction nie trzeba jak jesteś na 100% że gdzieś nie zostanie Ci otwarta transakcja (a o to nie trudno).

0

Tylko że transakcja zawsze wchodzi mi w stan active gdy otworze dataseta i trwa aż go zamknę. Dataset w ogóle się nie aktywuje jeśli komponent ibtransaction będzie active=false. Nie znalazłem sposobu zakończenia transakcji bez zamykania dataseta. A chce żeby był otwarty bo wyświetlane są z niego dane.

0

W IB/FB nie ma żadnej rzeczy która by się działa beztransakcyjnie (pomijam generatory - tu beztransakcyjność ma nieco inne znaczenie). Wszystko robi się w transakcji, jak tego nie zrobisz jawnie, to będzie to robione w transakcji domyślnej. A co do tego sposobu, to spróbuj CommitRetaining (ale to jest nie zalecane, bo zasoby na serwerze i inne śmoje boje).

1 użytkowników online, w tym zalogowanych: 0, gości: 1