Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщение с указанием имени пользователя, который редактирует запись 
:(
    Опции темы
alexeybarkalov
  Дата 16.10.2012, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 6.8.2011

Репутация: нет
Всего: нет



В программе есть масса различных справочников (таблицы с записями) определенной предметной области. При открытии того или иного справочника, создается "долгоживущая" транзакции с такими атрибутами
Код

'read_committed'
'rec_version'
'nowait'


т.е. если пользователь Иванов изменил запись в справочнике "А", и при попытке другого пользователя программы изменить эту же запись, выдастся сообщение "Запись редактируется другим пользователем" и так до тех пор пока Иванов не нажмет в интерфейсе кнопку "Сохранить изменения" (transaction.CommitRetaining) или "Отменить изменения" (transaction.RollbackRetaining).
Но хотелось бы выводить имя того пользователя, который редактирует эту запись (в сети более 50 пользователей, чтобы быстро понять кто что меняет) и соответственно выдавалось бы сообщение "Запись редактирует пользователь Иванов".

Как я сделал: создал в БД 
Код

таблицу 'USER_EDITS'
поля её такие:
GUID_TABLE - уникальный идентификатор таблицы БД которая редактируется
ROW_ID  - идентификатор записи из таблицы, которая редактируется
USER_ID - идентификатор пользователя который редактирует запись

Алгоритм прост, когда пользователь 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
PM MAIL   Вверх
Akina
Дата 17.10.2012, 07:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 454



Цитата(alexeybarkalov @  16.10.2012,  22:34 Найти цитируемый пост)
создается "долгоживущая" транзакции 

Вот от этого и избавляйтесь.
За каким хреном держать транзакцию, пока юзер читает, ковыряет в носу, ходит в сортир? Слей на него всё, что ему надо для корректировки и принятия решения, и пусть клиентская часть себе пыхтит с локальной копией данных и ждёт, пока юзер разродится директивой. А как разродится - проверь, что никто не изменил данные, откорректированные юзером. Всё чисто - апдейт в быстрой транзакции, данные изменились - сообщи об этом юзеру, выдав старый вариант, текущий (с указанием авторства), и его исправленный. Пусть думает, что с этим делать.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 17.10.2012, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(alexeybarkalov @  16.10.2012,  21:34 Найти цитируемый пост)
т.е. если пользователь Иванов изменил запись в справочнике "А", и при попытке другого пользователя программы изменить эту же запись, выдастся сообщение "Запись редактируется другим пользователем" и так до тех пор пока Иванов не нажмет в интерфейсе кнопку "Сохранить изменения" (transaction.CommitRetaining) или "Отменить изменения" (transaction.RollbackRetaining).


Пишущая транзакция должна быть МАКСИМАЛЬНО короткой по времени! Тогда не будет голова болеть  smile  по таким вопросам.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0944 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.