Może po prostu jest błąd w programie?
Przejdź krokowo program ("trace into") i w pobliżu zapisu i odczytu tej wartości porównaj jaka ona jest poprzez odczytanie jej z IBConsole. Miałem taką sytuację, że użyłem tej samem funkcji delphi w dwóch miejscach "żeby było szybciej". W jednym miejscu ona zerowała pewną zmienną a w innym nie miała zerować. Zapomniałem o tym, że funkcja zeruje tą zmienną i w drugim miejscu spowodowało to nieprawidłowe zerowanie.
Druga możliwość jest taka, że nie użyłeś transakcji. W interbase transakcji musi się używać RÓWNIEŻ jeśli tylko odczytujemy z bazy. Dajemy więc przy odczycie
try
TSQLConnection.StartTransaction
odczytujemy z bazy
finally
TSQLConnection.Commit
end
Przy zapisie trzeba dodatkowo dodać Rollback w bloku try except i w razie pojawienia się wyjątku powtórzyć pętlę aż nie będzie wyjątku. W ten sposób postępujemy przy każdym rodzaju baz SQL. Chodzi tu o zamianę równoległego zapisu do tego samego rekordu bazy (przez kilku użytkowników jednocześnie) na zapis szeregowy, czyli żeby transakcje nie zachodziły na siebie. Problem zachodzenia na siebie transakcji i otrzymywania przez to nieprawidłowych odczytów jest na tyle uciążliwy że ustawiam maksymalny poziom izolowania transakcji czyli:
var
TD: TTransactionDesc;
UdanyZapis:=False;
ProbaZapisu:=0;
TD.TransactionID := 1;
TD.IsolationLevel := xilREPEATABLEREAD;
repeat
try
UserSession.GraW16Connection.StartTransaction(TD);
ProbaZapisu:=ProbaZapisu+1;
//tutaj następują odczyty i zapisy do bazy
...........
UserSession.GraW16Connection.Commit(TD);
UdanyZapis:=True
except
UserSession.GraW16Connection.Rollback(TD);
sleep(random(5))
end;
until UdanyZapis or (ProbaZapisu>=LiczbaProbZapisu);