|
|
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Очень хотелось бы организовать блокировки не встроенными возможностями SQL server, а на уровне "клиента", т.е. блокировать не записи/таблицы и дт, а документы типа Чертеж,СбороСварочнаяМарка, Список оборудования чертежа и тд. Никаких оптимистических и прочек блокировок не надо. Нужно только организовать что-то вроде "Этот объект недоступен так как с ним работает пользователь такой-то". Вроде бы ничего сложного. Но есть изюминка - все клиенты, а это разнотипные приложения, с разных машин большой сети, в которой любой пользователь может работать с любой машины, конектятся к SQL Server под одним логином. Поэтому завел отдельную таблицу, в которую пишу при запуске клиентских приложений: Имя пользователя (определяю его средствами windows - т.е. средствами клиента.), Имя машины, Время подключения. SPID в эту таблицу не пишу, потому как клиентские приложения бывают отсоединяются, а затем вновь присоединяются к SQL Server тем самым меняют SPID. Отдельно веду таблицу блокировок, т.е. такой то пользователь заблокировал чертеж такой-то, и список оборудования такой-то. И вроде бы все хорошо. Но в определенный момент на клиенте случается или ошибка, или сбой питания, или умелые ручки нажали Reset и блокировки не убираются ;). Сломал голову по каким - же признакам определять что блокировку можно снять. Подскажите пожалуйста, если кто уже ломал голову над этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 10:02:25 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Есть интересный столбец в таблице master..sysprocesses - называется NETADDRESS, это есть MAC адрес сетевой карты компьютера пользователя. Его можно использовать и для блокировок и контроля за случайными отключениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 10:13:41 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Извините, но совершенно забыл написать что ситуация усложняется тем что ряд пользователь работает с программой запуская их на terminal server, таким образом имея одинаковое имя машины, сетевой адрес, и отличаясь только Именем пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 10:21:03 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
В любом случае определить и снять "дохлую" блокировку можно только по данным, которые идентифицируют коннект, то есть по таблице sysprocesses. Или как вариант - запоминать на клиенте старый @@spid и при переподключении к серверу апдейтить таблицу блокировок, и при ее организации использовать именно @@spid. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 10:46:49 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
sp_getapplock sp_releaseapplock ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 10:54:07 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
sp_getapplock в данном случае не подходит, так как ни о какой транзакции речь идти не может. Блокировка устанавливается когда один из клиентов редактирует какую-нибудь сущность. И снимаются когда он заканчивает. Во время редактирования может произойти обеденный перерыв, или просмотр вспомогательного отчета, или что нибудь еще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 11:18:23 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Почитай доку внимательно, там транзакции не обязательны... Если указать тип "session" то блокировка продержится до тех пор пока активен коннект или пока наложивший сам ее не снимет, это ровно то что тебе нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 11:40:01 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
2 Merle Так у них такое приложение, которое не держит коннект, а открывает и закрывает его много раз, и при этом еще какие-то ресурсы должно держать. АРМ'у можно посочувствовать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 11:47:41 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Не, я так понял, что если клиент отсоединился, значит блокировку нужно снять... Иначе проблем нет, ну нажал ресет, перезагрузился, залез обратно доделал все что надо и снял блокировку. Или я чего-то не понимаю... Если бы при сознательном отключении коннекта блокировка не снималась, то проблема с ресетом бы не стояла, точнее это был бы другой порядок малости, по сравнению с тем количеством юзеров, которые пошли пить кофе и забыли, что под них ресурс зарезервирован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 12:15:15 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Наверное непонятно выразил мысль. Блокировку надо снимать только когда на клиенте была сознательно запущена процедура "деблокировки", или когда он "отсоединился по RESET", но во время работы клиент может отсоединяться и вновь присоединяться к бд. Вопрос то собственно в том и есть как определять что он "отсоединился по RESET". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 12:29:05 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Почему тогда если клиент отсоединился "по ресет" он не может подсоединиться опять и снять блокировку? Какая разница, то он покурить пошел, а то ресет нажал... Сигарета 7 минут в среднем, а ресет как правило быстрее ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 12:50:46 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Может просто завести отдельное поле в головной таблице - признак блокировки? Или нужно обязательно имя пользователя? Тогда если только с клиента передавать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 14:07:51 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
Я лично такое никогда не делал, но мне кажется, что надо в таблице блокировок еще и держать поле, в которое бы ставилось время, до которого блокировка действительна. Блокирующая программа должна это время периодически корректировать (т.е. увеличивать). Т.е. допустим открывается документ, открывается блокировка, ставится врямя окончания блокировки: текущее время + 1 минута. Если документ до этого времени закончил редактироваться - блокировка снимается, если нет - программа должна чуть раньше окончания времени блокировки его подправить, увеличив еще на минуту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 14:50:36 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
в sap R/3 сделано следующим образом объявляется объект блокировки Создаются (на автомате) 2 функции: DEQUEUE_<имя объекта> - блокировать ENQUEUE_<имя объекта> - снять блокировку для ведения используется обычная таблица с ключом вроде <объект блокировки> -<значение объекта > - <пользователь > - <статус блокировки>- на чтение/на запись при обращении пользовательской программы к данным объекта блокировки происходит тривиальный select (ну, т.е. в sap есть спец. оператор) по данной таблице. Если блокировка имеется - то ... программист сам решает, что ему делать - прервать обработку или нет... коннект к SQL серверу только один - от application server. Естественно, последний обрабатывает все данные по пользователям/сеансам. Резюмируя, если не лень, то следует использовать application server как для контроля сеансов, так и для блокировок на объекты пользовательского уровня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 15:50:55 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
У меня было что-то подобное. Вышел из положения следующим образом: при старте программа разблокирует все заблокированные ей объекты. Таким образом если программа "завершилась неожиданно", все оставшиеся после нее объекты будут сняты при ее перезапуске. Проблема, однако не решается при полном крахе компьютера, когда последующий перезапуск невозможен :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 16:49:53 |
|
||
|
Организация блокировок ручками.
|
|||
|---|---|---|---|
|
#18+
если нужно 100% гарантия снятия блокировок и отсутствие гемора - трех-звенка то-что доктор прописал.... в принципе можно и внутри сервера все организовать ... но при периоде тайм аута в 1-5 минут нагрузка на сервер будет большая.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2002, 19:35:24 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3365&tid=1818336]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 308ms |

| 0 / 0 |
