![]() |
Модераторы: Akella |
![]() ![]() ![]() |
|
alexeybarkalov |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 62 Регистрация: 6.8.2011 Репутация: нет Всего: нет |
В программе есть масса различных справочников (таблицы с записями) определенной предметной области. При открытии того или иного справочника, создается "долгоживущая" транзакции с такими атрибутами
т.е. если пользователь Иванов изменил запись в справочнике "А", и при попытке другого пользователя программы изменить эту же запись, выдастся сообщение "Запись редактируется другим пользователем" и так до тех пор пока Иванов не нажмет в интерфейсе кнопку "Сохранить изменения" (transaction.CommitRetaining) или "Отменить изменения" (transaction.RollbackRetaining). Но хотелось бы выводить имя того пользователя, который редактирует эту запись (в сети более 50 пользователей, чтобы быстро понять кто что меняет) и соответственно выдавалось бы сообщение "Запись редактирует пользователь Иванов". Как я сделал: создал в БД
Алгоритм прост, когда пользователь X пытается изменить запись R1 из таблицы T1 программа пытается это сделать, если все ОК, то эта запись изменяется и в таблицу USER_EDITS вставляется или апдейтиться запись, что запись R1 c ROW_ID таблицы T1 c GUID_TABLE редактирует пользователь с USER_ID - как только пользователь сохранит или отменит эти изменения соответствующие записи из USER_EDITS удалятся; если же при изменении записи R1 возникает на уровне БД ошибка "wait transaction...", то программа смотрит в таблицу USER_EDITS и находит идентификатор USER_ID пользователя который редактирует запись R1 таблицы T1. Алгоритм с одной стороны прост, но с другой может привести к тормозам (лишняя возня в БД) + к ошибкам, например пользователь X что-либо на изменял, а затем по каким-то причинам связь с БД будет прервана и тогда записи в USER_EDITS останутся на веки вечные и соответственно изменить эти данные пользователь Y не сможет. Что можете посоветовать для реализации моего случая? Это сообщение отредактировал(а) alexeybarkalov - 16.10.2012, 21:35 |
||||
|
|||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 3 Всего: 454 |
Вот от этого и избавляйтесь. За каким хреном держать транзакцию, пока юзер читает, ковыряет в носу, ходит в сортир? Слей на него всё, что ему надо для корректировки и принятия решения, и пусть клиентская часть себе пыхтит с локальной копией данных и ждёт, пока юзер разродится директивой. А как разродится - проверь, что никто не изменил данные, откорректированные юзером. Всё чисто - апдейт в быстрой транзакции, данные изменились - сообщи об этом юзеру, выдав старый вариант, текущий (с указанием авторства), и его исправленный. Пусть думает, что с этим делать. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
Пишущая транзакция должна быть МАКСИМАЛЬНО короткой по времени! Тогда не будет голова болеть ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Interbase" | |
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |