![]() |
|
|
![]()
|
|
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Ситуация: 2 пользователя загрузили программу. Оба заходят как бы в одну таблицу и начинают добавлять записи. Всё проходит нормально, без косяков, но они не видят что добавил другой из них...а очень как хочется
А ещё иногда оба начинают редактить одну и туже запись и тут вообще аут начинается.... P.S> Использую понятно read_commited + rec_version + nowait. |
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
в FireBird есть Post event позволяющий оповещать клиентов об изменениях
в IB наверно тоже есть в тригере после обновления(вставки, удаления) пишеш Post event 'UPDATE' а в программе береш компонент IBEvents(он ловит эти сообщения из базы) и читаеш по нему хелп Это сообщение отредактировал(а) Frees - 13.4.2009, 12:44 -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
После добавления нужно делать close/open Добавлено через 3 минуты и 10 секунд
ну а как ты хотел Постарайся сделать так, чтобы пишущие транзакции были как можно короче. |
||||
|
|||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
с IbEvents понял, спасибо. Akella сделать пишушие транзакции как можно короче, это же не означает делать пост после каждого измененного поля?
А есть какая-нибудь возможность заблокировать на редактирование запись которая уже редактируется? Я конечно не имею ввиду случаи с использованием временной таблицы, куда постоянно будет стекать инфа о том какие таблицы и кем сейчас редактируются и далее при попытке редактирования просто брать её оттуда. Хочется что-нибудь покрасивее и на уровне компонентом чтоли. |
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
http://www.ibase.ru/devinfo/pslock.htm -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 29 Всего: 329 |
Нет. Нужно сделать примерно так: Пользователь нажимает кнопку Редактировать. Программа считывает в элементы управления все данные из записи. Но сама запись на редактирование не открывается, т.е. никакого update не происходит. Т.о. запись не блокируется. Пользователь что-то меняет на форме. Нажимает кнопку Cохранить. И вот здесь уже работает пишущая транзакция. Т.е. пользователь может держать форму редактирования/добавления (без выполнения update table) достаточно долго. Т.о. пишущая транзакция работает _только_ в момент сохранения/добавления записи. При этом требуется учитывать специфику работы пользователей и самого приложения. Проблема может быть в том, что запись нужно будет блокировать на время редактирования. В этом случае обрати пристальное внимание на сообщение уважаемого Frees`а |
|||
|
||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Угу Akella 10x, но именно специфика не позволяет так работать. Frees тоже спасибо, линк полезный.
Возник один вопрос, вроде читал внимательно и проверил как работает - круто Но проблема вот в чем: два человека могут открыть одновременно одну группу записей, как бы попадающих под общую специфику. Так вопрос: 1) можно сделать "for update with Lock" для всей группы записей при открывании формы. +) Нет мозгопарства, один запрос. -) Двое уже не зайдут. А если и зайдут, то второй максимум что сможет это смотреть в режиме чтения и ничерта не поймёт при этом. Мало того второй может хочет поменять вовсе не ту запись которую редактирует первый. 2) можно сделать "for update with lock" только для конкретной записи при её изменении, но тогда у пользователя вынужденны будут исчезнуть остальные записи группы пока он не закончит редактирование. +) Lock одной записи -) Всё исчезло неожиданно, пользователь в шоке, начинается паника в отделе и звонки во все инстанции включая президента. Как бы так от минусов избавиться хитро? В идеалы бы как-нибудь открыть все записи, а при редактировании заблокировать текущую и после редактирования все измененные данные скинуть, предварительно завершив лок. Это сообщение отредактировал(а) pavelv - 14.4.2009, 11:39 |
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
почему исчезнут, поясни чет я не пойму -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| pavelv |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Изначально выборка ведется допустим:
Затем, чтобы залочить только одну запись(это второй случай), нужно видимо сделать так:
Если при этом результат запроса было видно в ДБГрид, то их там больше не будет ибо запрос поменялся. Это сообщение отредактировал(а) pavelv - 14.4.2009, 13:25 |
||||
|
|||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
для такого случая можно использовать еще один запрос(не Грида) либо заблокировать в этом датасете если нет авто комита то
заблокирует текущую запись, в FIBPlus вместо едит пост есть спец метод LockRecord. Компоненты доступа у тебя какие? -------------------- Кольцов Виктор Владимирович |
|||
|
||||
| pavelv |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 245 Регистрация: 5.2.2006 Репутация: нет Всего: нет |
Но в этом случае прийдется редактировать записи именно через него. Представь форму, сверху грид со всеми записями, а ниже параметры текущей записи доступные для редактирования. Возьму другой запрос, все поля для редактирования нужно переделывать для него. А там компоненты использованы: TDBEdit, TDB*.... Ну кароче датасурс во всех поменять прийдется. Сильно муторно думаю... Компоненты доступа: TibTable + DataSource + IbUpdateSqlW FireBird 2.0 Слушай гляну сейчас, если есть LockRecord то вообще никаких проблем получается |
|||
|
||||
| Frees |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2233 Регистрация: 2.12.2005 Где: Екатеринбург Репутация: 23 Всего: 54 |
нет можно и через датасет грида редактировать если он в той же транзакции -------------------- Кольцов Виктор Владимирович |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |