SevereK20
Gold Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору eddoc Я не большой спец, но задавалася уже этим вопросом. Пример 1-на клиентском приложении при закрытии программы делать инсерт в лог о том, что пользователь покинул бд. Понятное дело, что при обрывах сети, аварийном завершении работы и т.д. метод не сработает. Собственно говоря когда я писал я опирался на это сообщение (с другого форума) Цитата: 1. Добавил по одному полю (назвал его Locker) к каждому документу (т.е. к соотв. таблице). 2. Создал простенькую табличку LockDoc с одним полем DocNum. Его же сделал ПК. Тут надо, правда, отметить, что нумерация (ПК) у всех типов документов у меня в базе сквозная, т.е. нет никаких (каких бы то ни было) документов с одним номером. Но, думаю, это преодолимо. 3. При начале редактирования первым делом пытаемся вставить в таблицу LockDoc номер редактируемого документа. Если такой номер там уже есть, (это значит, что его кто-то уже редактирует), то получим нарушение ограничения ПК. Обрабатываем это исключение на клиенте, сообщая ему, что юзер такой-то уже начал изменять документ (о имени юзера см. следующий пункт). 4. Если вставка номера в таблицу LockDoc прошла успешно, то: 4.1. Транзакцию на обновление LockDoc оставляем открытой до конца редактирования документа. 4.2. В поле редактируемого документа Locker вписываем USER и завершаем эту транзакцию (для того, чтобы это имя можно было потом прочитать). Если конкурирующий юзер нарвется на невозможность начать редактирования документа, то формируется запрос к этому документу, откуда мы и получим имя юзера - "блокировщика". 5. После окончания редактирования документа откатываем транзакцию для таблицы Locker (т.е. убираем от-туда номер заблокированного документа. Для тех, кто видит в откате плохой тон, можно Commit - Delete - Commit). В отредактированном документе имя юзера в поле LockDoc просто оставляем - оно никому не мешает. |
|