(написано на Delphi 7, БД на FireBird 1.55 и 2.1)
в рамках каждого потока создается DataModule, на котором лежат IBDataBase, IBSQL и т.д.
на форме есть компонент IBTransaction, установлены параметрыAllowAutoStart=true, Params:
read_committed
rec_version
nowait
Перед каждым выполнением запроса вызывается процедура _StartTransaction, после вызывается _Commit или _RollBack
Код: Выделить всё
procedure TDirectIBConnection._StartTransaction;
begin
Inc(FTransCount);
if FTransCount = 1 then
ForceStartTransaction;
end;
procedure TDirectIBConnection.ForceStartTransaction;
begin
_CheckConnected;
if not ibtrMain.InTransaction then
ibtrMain.StartTransaction;
end;
//где ibtrMain - имя компонента IBTransaction
procedure TDirectIBConnection._Commit;
begin
if FTransCount > 0 then
Dec(FTransCount);
if (FTransCount = 0) then
ForceCommit;
end;
procedure TDirectIBConnection.ForceCommit;
begin
if ibtrMain.InTransaction then
ibtrMain.Commit;
FTransCount := 0;
end;
procedure TDirectIBConnection._Rollback;
begin
ForceRollback;
end;
procedure TDirectIBConnection.ForceRollback;
begin
if ibtrMain.InTransaction then
ibtrMain.Rollback;
FTransCount := 0;
end;
Вроде все логично. Но периодически возникает ситуация когда пользователь вводит записи и сам видит, что они введены, но другие пользователи их не видят. После перезапуска системы и этот пользователь записи уже не видит.
Теоретически понятно, что произошло рассогласование количества вызовов _StartTransaction / _Commit и не было вызово _RollBack, которые бы все привели в норму. Но в коде такого куска найти не удалось .
Ситуация возникает раз в неделю при одновременной работе более чем 100 пользователей и смоделировать ее не удается. Логи сделать и просмотреть тоже нереально.
Соответственно вопрос, как мне обойти эту проблему? Может настройки транзакции поставить другие?
Думаю сделать чтение данные через другую транзакцию и тогда если транзакция добавления "зависла", тогда пользователь не увидит введенную запись сразу и можно будет тупо перезайти в систему. Криво, но других идей нет.
Посоветуйте!!!