Здравствуйте. Разработал СУБД на Firebird. Когда один пользователь - все работает замечательно. Но недавно начал тестировать ее по сети, и выяснил следующую вещь. Если запущено 2 экземпляра программы, то во втором не видны изменения, сделанные в первом. Т.е. заходишь в какой-нибудь документ, меняшь там сумму, записываешь. Смотришь с другого компьютера - а в этом документе сумма старая! Изменения видны только после перезапуска программы. Т.е. данные-то пишутся, но как-то странно.
Плюс, если пытаться со второго компьютера отредактировать только что измененную на первом запись, выдается ошибка Deadlock. Update conflicts with concurrent update.
Конфигурация: Lazarus 1.0.14, Firebird 2.5.2, ZEOS 7.1.2 Stable
Firebird. При работе по сети не видны изменения.
Модератор: Модераторы
- *Rik*
- постоялец
- Сообщения: 453
- Зарегистрирован: 19.04.2011 12:18:51
- Откуда: Урал
- Контактная информация:
alexs писал(а):Вам надо изучить механизм транзакций.
В частности - у вас скорее всего snaphot транзакция и не разу не подтверждается во время работы.
Кроме этого, могу предложить вам использовать компоненты IBExpress, которые я немного "допилил". В отличие от ZEOS, для создания "живых" запросов, достаточно одной компонены TIBDataSet, в ней изначально предусмотрены SQL запросы для выборки, вставки, редактирования, удаления, обновления данных, UpdataObject не требуется. Вы можете управлять пишущей и читающей транзакцией раздельно, чтобы избежать блокировок и ситуаций подобной вашей, полный контроль над транзакциями. Есть автоформатирование полей (для числовых данных: разделение разрядов, точность после запятой в соответствии с точностью поля заданной при создании этого поля, форматирование дат), можно задавать персональные форматы для отдельных полей и форматы редактирования данных.
Добавлена поддержка выражений RETURNING FIELD в Insert и Update запросах, поддержка возвращаемых значений из EXECUTE PROCEDURE, поддержка выражения EXECUTE BLOCK.
Все бесплатно и кросс-платформенно.
visual-t.ru
В TZConnection есть свойство TransactIsolationlevel поставил там tiReadCommitted тогда показывает изменения на другом компьютере только после обновление SQL запроса.
Спасибо всем за ответы и советы. Помогло в ZConnection поставить TransactIsolationlevel в tiReadCommitted. И также при записи какого-оибо объекта делаю перед началом записи изменений ZConnection.StartTransaction, а после окончания - ZConnection.Commit.
btsoft писал(а):Помогло
alexs прав, вам надо идти на сайт к kdv(ibase.ru) и читать основы работы с БД. Там очень много нюансов, и вы набьете себе еще не одну шишку, пока не почитаете об этом или не познаете на собственном печальном опыте
