lazarus = Firebird - транзакции
Модератор: Модераторы
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Раньше вы писали про ошибку компиляции, теперь - времени выполнения. Так где ошибка возникает?
У меня нет FB так что проверить не могу. Но ошибка при закрытии программы может быть вызвана тем, что вы закрываете при активном соединении с базой и не освобожденных созданных объектах.
У меня нет FB так что проверить не могу. Но ошибка при закрытии программы может быть вызвана тем, что вы закрываете при активном соединении с базой и не освобожденных созданных объектах.
Ошибку при компиляции поборол, теперь при исполнении.
Причем только при запуске в отладчике, при запуске просто exeшника все нормально. Но как то "очкую" ;-0, что за хрень?
В отладчике увидел только что вызывается SIGSEGV в application.inc в процедуре
Добавлено спустя 5 часов 52 минуты 52 секунды:
Поборол SIGSEGV. Сам был виноват.
теперь другая проблема, я там понял что эвенты об изменении, добавлении и т.д. данных в таблице сервером присылаются только после Commit.
Я начал отлавливать эти события.
Теперь в процедуре
хотел рефрешить датасет , чтобы обновлять даные. Но не выходит
Что я только не пробовал. И закрывал и открывать SQLQuery , делал Active:= False, Active:= True, делал Refresh запроса, не помогает, данные не обновялются...
Они обновляются только если я отключаю и включаю сам IBConnection.
Но тогда пропадает TFBEvent. Ну не инициализировать же его каждый раз заново после каждого Commit на сервере, ЧЯДНТ?
Может не так настроен у меня DataModule. Подскажите пожалуйста.
Причем только при запуске в отладчике, при запуске просто exeшника все нормально. Но как то "очкую" ;-0, что за хрень?
В отладчике увидел только что вызывается SIGSEGV в application.inc в процедуре
Код: Выделить всё
{------------------------------------------------------------------------------
TApplication RunLoop
control is passed to event processor.
------------------------------------------------------------------------------}
procedure TApplication.RunLoop;
begin
repeat
if CaptureExceptions then
try // run with try..except
HandleMessage;
except
HandleException(Self);
end
else
HandleMessage; // run without try..except
until Terminated;
end; Добавлено спустя 5 часов 52 минуты 52 секунды:
Поборол SIGSEGV. Сам был виноват.
теперь другая проблема, я там понял что эвенты об изменении, добавлении и т.д. данных в таблице сервером присылаются только после Commit.
Я начал отлавливать эти события.
Теперь в процедуре
Код: Выделить всё
procedure TMainForm.OnFBEvent(Sender: TObject; EventName: string;
EventCount: longint; var CancelAlerts: boolean);хотел рефрешить датасет , чтобы обновлять даные. Но не выходит
Что я только не пробовал. И закрывал и открывать SQLQuery , делал Active:= False, Active:= True, делал Refresh запроса, не помогает, данные не обновялются...
Они обновляются только если я отключаю и включаю сам IBConnection.
Но тогда пропадает TFBEvent. Ну не инициализировать же его каждый раз заново после каждого Commit на сервере, ЧЯДНТ?
Может не так настроен у меня DataModule. Подскажите пожалуйста.
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
Имхо, у вас проблема с транзакциями и только с ними.
То есть вы стартуете "длинную" транзакцию чтения, меняете данные в другой и рефрешите свой датасет в старой транзакции, которая ничего не знает об измененных данных.
Приведите код как вы стартуете транзакции на чтение и запись и с какими параметрами.
p.s. Events прекрасно работают без всяких плясок. Правда использую ibx для доступа к Firebird.
То есть вы стартуете "длинную" транзакцию чтения, меняете данные в другой и рефрешите свой датасет в старой транзакции, которая ничего не знает об измененных данных.
Приведите код как вы стартуете транзакции на чтение и запись и с какими параметрами.
p.s. Events прекрасно работают без всяких плясок. Правда использую ibx для доступа к Firebird.
Помогла эта тема viewtopic.php?f=5&t=10232&p=85344&hilit=Refresh#p85344
Ввел параметры
nowait
read_committed
rec_version
До этого в трасировке была CONCURRENCY
Ввел параметры
nowait
read_committed
rec_version
До этого в трасировке была CONCURRENCY
проблемы работы с объектами/указателями/данными которых нет или они другие.. это в народе называется утечка памяти..bpg писал(а): вываливается External SIGSEGV.
EventsM может не в чем не виноват.
проблему должен показать контроль кучи..
http://wiki.freepascal.org/heaptrc
POST_EVENT о событиях в таблицах из тригера приходит только после Commit. Как тогда узнать о событии Вставки, например?
И зачем тогда нужны Event от самой БД, о подключении , отключении, начале транзакций и т.д.? Ведь в них пропадает весь смысл? Если был Commit то и так ясно что подключение было. Или я не прав?
Мне бы хотелось в приложении выводить в статус события происходящие с БД.
И зачем тогда нужны Event от самой БД, о подключении , отключении, начале транзакций и т.д.? Ведь в них пропадает весь смысл? Если был Commit то и так ясно что подключение было. Или я не прав?
Мне бы хотелось в приложении выводить в статус события происходящие с БД.
bpg писал(а):Как тогда узнать о событии Вставки, например?
Тогда ответь - когда данные являются актуальными для всех? До того как их внесли или после того как они станут доступны всем?
Смысл в том чтобы клиенту сообщить об изменении данных.. типа некий твит или телеграмм сообщения. Очень нужная вещь если клиентов много и/или данные тяжелые.bpg писал(а):И зачем тогда нужны Event от самой БД
Вообще то только одними компонентами и самой БД легко реализовать чат. Сообщения записываются в таблицу, подается сигнал об обновлении записи в таблицу.. клиенты Refresh-ат локальные таблицы.
Events скорее низкоуровневое сообщение - как светофор на перекресте..bpg писал(а):выводить в статус события происходящие с БД.
В разных корпусах в разных кабинетах люди заносят личные дела, другим сотрудникам они нужны для обработки данных, занесения их в приказы и т.д.
Естественно, если нашли ошибку и данные изменили, нужно чтобы они СРОЧНО у всех обновились. Также если завели нового человека, то нужно чтобы у ответственного сотрудника тут же при формировании отчета добавлялся бы этот новый человек в отчет сразу.
Естественно, если нашли ошибку и данные изменили, нужно чтобы они СРОЧНО у всех обновились. Также если завели нового человека, то нужно чтобы у ответственного сотрудника тут же при формировании отчета добавлялся бы этот новый человек в отчет сразу.
Есть же автоматы.. искусственный интеллект. m2m https://ru.wikipedia.org/wiki/%D0%9C%D0 ... 0%B8%D0%B5alexs писал(а):А зачем вообще обновлять пользователю таблицу с данными автоматом?
в некоторых системах критично скорость обновления информации. Пример: Онлайн - торги, навигация, там где нужно анализировать большой объем информации, где стоимость обновления крайне высока, слабые сети.
Я своему другу в свое время предлагал заняться m2m (человек->машина,машина->человек,машина->машина). Но тот ссылался, что ему нужно семью кормить и продал свою программистскую душу 1С.
Через лет пять я узнал, что в Европе это направление признали очень перспективное - ну и заложили кучу денег на многие года.
Кстати, если разрабатываете пользовательский интерфейс то это уже человек->машина,машина->человек.
Сейчас компоненты приняты делаются "мультяшными" прикручивают движение, свечение, нажатие - с физическими параметрами. Это смотрится красиво и интересно..alexs писал(а):Дайте ему кнопку "Обновить". Ему нужно будет - нажмёт.
Даже у знакомых всем делфовских платных компонент за тысячу евриков - появление информации идет с "пробуксовкой", с неким волшебством - а не сразу "плюх".
А Вы все по старому - у нас тут самообслуживание, на кнопу нажимаем сами..
Добавлено спустя 9 минут 4 секунды:
все правильно.bpg писал(а):Естественно, если нашли ошибку и данные изменили, нужно чтобы они СРОЧНО у всех обновились. Также если завели нового человека, то нужно чтобы у ответственного сотрудника тут же при формировании отчета добавлялся бы этот новый человек в отчет сразу.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Ну так таймер добавьте на Refresh, уже писали - всего делов-то! если данных больше дары десятков строк, то таблица юзеру, в любом случае, показывает только часть данных, любое пролистование уже сделает Refresh.bpg писал(а):Естественно, если нашли ошибку и данные изменили, нужно чтобы они СРОЧНО у всех обновились. Также если завели нового человека, то нужно чтобы у ответственного сотрудника тут же при формировании отчета добавлялся бы этот новый человек в отчет сразу.
А с отчетами еще проще - запрос для отчета всегда будет давать актуальные данные с сервера, после транзакции на изменение/добавление.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
olegy123 писал(а):появление информации идет с "пробуксовкой", с неким волшебством - а не сразу "плюх".
Меня, блин, с потрохами сьедят, если в моих системах будет задержка открытиядокумента на 0.5 секунды. А за всякие блымканья на экране - вой стоит до небес.
Когда чел пялится в монитор с 8 и до 17 с часовым перерывом - ему эти красивости - только вред.
olegy123 писал(а):в некоторых системах критично скорость обновления информации. Пример: Онлайн - торги, навигация, там где нужно анализировать большой объем информации
Это не решается автообновлением. Если чел сидит и аналитичит - то ему важнее развёртки и удобные переходы между массивами. А статическая перерисовка одной и тоже инфы (всего лишь при изменении параметров) - не нужна. В литературе даже случай описан - когда вывод информации шёл таким потоком - что оператор растерялся и всё бросил, никак не реагировал. Была авария.
bpg писал(а): разных корпусах в разных кабинетах люди заносят личные дела, другим сотрудникам они нужны для обработки данных, занесения их в приказы и т.д.
Введённые данные доступны сразу и другим операторам - они то уже в БД. А вот нужны ли они перед глазами - это уже вопрос. Человек делает свои документы. И ему "чужая" информация в сей момент не нужна. Когда нужна будет - так ваша программ покажет её.
Мой любимый пример - операторы у меня непрерывно вносят документы. В день на оператора считается норма - 100 документов. Информации вносится очень много постоянно. Но в среднем у оператора в каждый момент времени либо открыта форма ввода текущего документа, либо открыт реестр документов с последним введённым данным оператором документом (открываю автоматом после сохранения документа).
А вот если надо - то есть и кнопка "Документы дня", и всевозможные фильтры на документы. И итоги всякие считаются.
bpg писал(а):Естественно, если нашли ошибку и данные изменили, нужно чтобы они СРОЧНО у всех обновились.
Главное чтобы они были исправлены в БД.
Вы же не печатаете все эти документы сразу после ввода?
alexs писал(а):Меня, блин, с потрохами сьедят, если в моих системах будет задержка открытиядокумента на 0.5 секунды. А за всякие блымканья на экране - вой стоит до небес.
Мне нужно было работать с КЛАДР(это вроде 500мб). Клиент тонкий и должен работать на <1Мб/с.. Там локально не так шустро работало.
Вот приходилось прикручивать функционал на лимитах работать, фоновая подкачка данных.
Позиция в таблице оставалось текущей и в том месте экарана (общая позиция 6932 на экране 15) - при обновлении будет та же 15-ая, а не 1ая. Поэтому не нужно было от оператора требовать ручного управления.
Вот вы не сидите с 8 до 17 на табурете? Скорее в кресле - так удобно.alexs писал(а):Когда чел пялится в монитор с 8 и до 17 с часовым перерывом - ему эти красивости - только вред.
Так вот не комфортность можно вызвать даже размером букв и цвета. А некоторые цвета могут даже вызвать эпилептический припадок. О гамма цвета вы не думаете - только потому что за вас уже подумала windows.
Тогда зачем делают компоненты на продажу с эффектом "музыкальности"?alexs писал(а):Это не решается автообновлением. Если чел сидит и аналитичит - то ему важнее развёртки и удобные переходы между массивами. А статическая перерисовка одной и тоже инфы (всего лишь при изменении параметров) - не нужна.
Может с ними легче работать..
Добавлено спустя 8 минут 37 секунд:
А в играх как? Может там мозг в своей среде - работает в оптимальном режиме.. и обрабатывать в разы больше информации.alexs писал(а):В литературе даже случай описан - когда вывод информации шёл таким потоком - что оператор растерялся и всё бросил, никак не реагировал. Была авария.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
olegy123 писал(а):Мне нужно было работать с КЛАДР(это вроде 500мб).
Этот пример уже вообще не в тему. Полный список тянуть на клиента (хоть тонкий, хоть толстый) - лишний геморой. Надо обрабывать запрос юзера и на основе его тащить данные.
olegy123 писал(а):Вот вы не сидите с 8 до 17 на табурете? Скорее в кресле - так удобно.
Многие операторы вообще стоят
olegy123 писал(а):огда зачем делают компоненты на продажу с эффектом "музыкальности"?
Наверное чтобы продать? Вау эффект никто не отменял.
olegy123 писал(а):Может там мозг в своей среде - работает в оптимальном режиме.. и обрабатывать в разы больше информации.
Мы про обновление списка у юзера на экране? Или про что?
Так пришлось разбивать данные. Не тянуть весь список, лимитировать кол-во в запросе (около 100).. по первым символам изменять список в ComboBox. Если позиция зафиксирована - подгружать следующий список. Ошибки выделять цветом, можно конечно выплевывать модальное окно мол хрень написали, а можно цветом выделить где не нравится или не введены данные и спрятать(Enable:=false) кнопку "Сохранить".alexs писал(а):Надо обрабывать запрос юзера и на основе его тащить данные.
По теме. Само POST_EVENT для человека никакой информации не несет. А вот для машины - да, машина сигнализирует через интерфейс человеку что состояние или данные изменились. А может ничего не сообщать.
нет. Wow эффект это на неделю две.. потом к новому предмету привыкаете.alexs писал(а):Наверное чтобы продать? Вау эффект никто не отменял.
