Мое знакомство с миром Microsoft SQL Server с использованием ADO (dbGo), и я написал много приложений для этой среды. Теперь у меня есть устаревшее приложение Delphi 7 с базой данных Firebird 2.5, которую я должен поддерживать.
НО я обнаружил, что если 2 клиентских приложения выполняют это:
SQLQuery.SQL.Text := 'Update mytable set field1 = 11 where keyfield = 99'
SQLQuery.Execute;
примерно в то же время, второе приложение немедленно получает ошибку "тупика". В SQL Server будет период ожидания
ADOConnection.Isolationlevel = ilCursorstability;
ADOConnection.CommandTimeout := 5;
прежде чем какое-либо исключение возникнет во втором клиентском приложении. Обработка исключений может включать откат в том, что будет считаться очень необычной ситуацией в пакетном процессе. Это разумно. 5 секунд - очень долгое время в обработке компьютера.
Теперь мои попытки использовать ту же методологию у клиента Firebird оказались бесплодными, потому что "тупик" (фактически, используемая запись) происходит немедленно.
Если движок базы данных не может быть настроен на то, чтобы немного ждать улучшения условий (блокировки записи должны быть выпущены), ответственность теперь должна быть оставлена разработчиком клиентского приложения, который должен писать безумно медленный код, чтобы преодолеть то, что мне кажется быть серьезным провалом Firebird.
Как только обнаружен "тупик", условие не очищается, кроме как отсоединив компонент соединения
while rowsupdated = 0 and counter < 5 do
begin
try
rowsupdated := SQLQuery.Execute;
except
SQLConnection.Connected := False;
SQLConnection.Connected := True;
end;
Inc(Counter)
end;
Как вы создаете надежные многопользовательские клиенты для обновления таблиц, если у вас нет существенного блокирующего допуска в Firebird, используя DBX в Delphi?