powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как организовать работу с табличной частью док-та, блокировки и все такое?
13 сообщений из 13, страница 1 из 1
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32015610
Игорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть док-т. Необходимо организовать с ним монопольный режим работы, оставив возможность чтения для других. Куча народу могут обрабатывать табличную часть независимо от шапки.
Хочется исключить изменения табличной части при открытии док-та.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32015621
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=2739&Idle=365&Sort=0&Order=Descend&Page=0

Тут по этому поводу разговор
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32015629
Предлагаю такую концепцию. Метка "взято на редактирование" состоит из двух полей: ID процесса и даты логина. Эта парочка значений уникальна во времени и в пространстве (в пределах сервера). Берущий на редактировании проставляет в записи метку, беря значения из sysprocesses (spid и login_time). При окончании редактирования метка обнуляется. При потере коннекта запись в sysprocesses c этой парой значений перестает существовать (это происходит достаточно быстро), поэтому это можно проверить. Условие "а есть ли метка" имеет положительное значение только при выполнении одновременно 2-х условий: (1) поля заполнены и (2) эти значения есть в sysprocesses. Все коннекты, желающие взять запись на редактирование, проверяют эти 2 условия. Если хоть одно из них ложно, то - метки нет, и запись можно взять на редактирование.

Достоинства метода:
1) Легко управляемо.
2) Легко определяемо. Всегда можно узнать, кто взял на редактирование.
3) Отсутствует проблема оставщейся метки, если клиент, редактирующий запись, оторвался.
4) Отсутствие блокировок.

Если надо избежать злоупотреблений типа кто-то взял на редактирование, и не закрывая приложение, ушел к любовнице, можно добавить еще одно поле, где проставлять время взятия на редактирование, и к двум условиям добавить и третье "прошло не больше ... часов".

Кто дочитал до конца и не устал от моей манеры сумбурно описывать хаос моих мыслей - спасибо.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32015723
Vary
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я ничего не понял. Кто объяснит?
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32015747
AlexanderVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня примерно такое же решение: В базе tempDB есть таблица активных коннектов, и таблица "блокировок", куда ведется запись кто, когда и какую запись взял на редактирование. Каждая таблица в базе имеет свой ИД. В результате в таблицу блокировок записывается строка состоящая из SPID, ИД таблицы, ИД записи, даты и времени блокировки. Прежде чем взять что-то на редактирование, необходимо проверить содержимое данной таблицы и если данную запись кто-то уже заблокировать - отказать в доступе.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016053
Barbar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Глеб Уфимцев
Добавлю, что при установлении нового соединения надо сразу снимать метки со своим spid. Т.к. после разрыва соединения одним пользователем, второй может установить соединеие с его, только что освобожденным значением spid.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016057
Alexander Stepanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Barbar

Как раз для этого используется еще и поле login_time.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016058
> Добавлю, что при установлении нового соединения надо сразу снимать метки со своим spid. Т.к. после разрыва соединения одним пользователем, второй может установить соединеие с его, только что освобожденным значением spid.

Ну, и что? Пусть ради бога устанавливает свою метку, если ему надо. Это теперь его метка, а тот - предыдущий - уже оторвался, следовательно, метка его недействительно и запись свободна.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016059
Ты не понял - у нового пользователя с тем же spid, что и у предыдущего, будет другое значение login_time, а следовательно, никто не сочтет метку от старого пользователя за метку нового.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016116
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне очень понравилась идея Глеба Уфимцева. Добавлю только, что она ориентирована на кратковременное взятие на редактирование. В некоторых случаях (когда документы требуют многодневной проработки) необходима возможность оставлять электронный документ заблокированным. Реализовать такой механизм гораздо проще и вариантов реализации множество. Додумать каждый может как ему нравится.
Лично я предполагаю использовать совокупность двух методов, поскольку в нашей системе преполагается использование документов с широким диапазоном сроков проработки.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016117
Alexander Chepack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно еще и задачку организовать, которая бы раз в 5 - 10 минут чистила бы несуществующие метки.
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016447
__Roman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, в SQL Server есть возможность блокировать данные на уровне записей.
Чтобы использовать данную фичу, скажем, при редактировании табличной части дока на экране
клиентского компьютера
(т.е. когда нужно: 1)заблокировать 2)дать юзеру возможность редактировать 3)разблокировать)
нужно:
1) перед выборкой данных начать транзакцию с уровнем изоляции SERIALIZABLE или READCOMMITTED
2) сделать что-то типа SELECT .. from DOC_TABLEPART with (ROWLOCK HOLDLOCK) where DOC_ID = ...
3) на клиенте (если это АДО), использовать тип блокировки adLockPessimistic
4) выдать форму для редактирования
5) по закрытии формы - сделать COMMIT TRANSACTION

А для того, чтобы клиенты могли тем не менее читать заблокированные строки, необходимо
в запросах на чтение указывать хинт with (NOLOCK) или with (READUNCOMMITTED):
select .. from DOC_TABLEPART with (READUNCOMMITTED) where DOC_ID = ...
...
Рейтинг: 0 / 0
Как организовать работу с табличной частью док-та, блокировки и все такое?
    #32016449
__Roman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, полезна вещица "SET LOCK_TIMEOUT 0", перед началом транзакции или выполнением запроса
говорит серверу, что надо сразу выдавать @@ERROR != 0 и прекращать выполнение стейтмента,
если имеет место попытка выбрать/обновить заблокированные данные.
Короче, читайте MSDN или SQLBOL на тему о блокировках...
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как организовать работу с табличной частью док-та, блокировки и все такое?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]