powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Блокированные записи
25 сообщений из 31, страница 1 из 2
Блокированные записи
    #32046510
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как при открытии рекорсета на клиенте (ADO 2.7)
Определить блокированы другим юзером записи или нет (желательно также узнать тип блокировки).

Проблема: UpdateBatch с группой записей не проходит при если записе были изменены...
...
Рейтинг: 0 / 0
Блокированные записи
    #32046540
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1-я транзакция:
begin tran
update customers set CustomerID = CustomerID where CustomerID = 'ALFKI'

2-я транзакция:
set lock_timeout 0
begin tran
update customers set CustomerID = CustomerID where CustomerID = 'ALFKI'
if @@error <> 0 begin
rollback
print '!!!'
end
else commit
set lock_timeout -1
...
Рейтинг: 0 / 0
Блокированные записи
    #32046548
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дед Маздай

В транзакции можно заблокировать записи не используя операцию обновления. Вот конструкция, аналогичная Вашей:
Код: plaintext
1.
2.
3.
begin tran 
select CustomerID from customers with(holdlock) where CustomerID = 'ALFKI' 
...

Никто не сможет изменить записи, попавшие в диапазон запроса до завершения транзакции.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046555
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо...
Но вопрос открыт:
Update не через хп, а с клиента через ADO,
так вот, при открытии usercontrol'a, хотелось бы знать, блокирована запись (записи) другими процессами или нет, если блокированы то вывести рекордсет с ReadOnly а контролы залочить, чтоб юзер зря не тыкался...
...
Рейтинг: 0 / 0
Блокированные записи
    #32046559
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотри master..sysprocesess,master..locks,master..lockinfo//
...
Рейтинг: 0 / 0
Блокированные записи
    #32046570
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Mice
это понятно, но каждый раз при открытии рекордсета
смотреть системные таблицы...
Неужели попроще нельзя?
...
Рейтинг: 0 / 0
Блокированные записи
    #32046575
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще говоря, блокировки являются внутренним механизмом сервера для обеспечения целостности данных. Если Вы хотите сами управлять ими, то это все равно, что сказать, почему я не могу, например, полностью держать под контролем план выполнения запроса? Мне не нравится план, который строит сервер, как подсунуть оптимизатору мой собственный? Существует базовый встроенный функционал как данность. Если хочется управлять абсолютно всем - проще написать свой собственный сервер.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046579
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дед Маздай:
Я НЕ ХОЧУ управлять блокировками на сервере, я хочу знать блокирована запись или нет и исходя из этого решать свои задачи...
Отлавливать код ошибки при попытки апдейта не самый лучший способ..

ЗЫ. И не надо пальцы раскидывать, не можешь помочь - неча постить..
...
Рейтинг: 0 / 0
Блокированные записи
    #32046581
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут Dankov советует
...
Рейтинг: 0 / 0
Блокированные записи
    #32046582
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory:
Спасибо, то что надо...
...
Рейтинг: 0 / 0
Блокированные записи
    #32046593
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нравится - не ешьте, но зачем плеваться? Да и на брудершафт мы с Вами, в общем-то, не пили.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046598
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините за фамильярность, но пожалуйста читайте вопрос и отвечайте по теме,
а не тыкайте носом -
Чувак не нравится пиши свой сервер
(вольный перевод Вашего сообщения)
Все когда-то начинали...
...
Рейтинг: 0 / 0
Блокированные записи
    #32046613
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну на самом деле Вы правильно сделали, что извинились, потому что рецепт Dankov'a вообще говоря не работает при всем к нему уважении. Хотел было оставить Вам эти грабли, раз Вы такой умный, но ладно уж. Вот смотрите:

1-я транзакция:
begin tran
select * from customers (holdlock)

Вы про нее ничего не знаете, поэтому сделали по данному Вам совету
2-я транзакция:
select * from customers (readpast)
Увидели, что все записи якобы свободны, обрадовались и сделали следующим шагом
update customers set customerid = customerid where customerid = 'alfki'
Ну и, естественно, попались.

В то же время, если в 1-й транзакции заменить select * from customers (holdlock) на update customers set customerid = customerid where customerid = 'alfki', то все будет работать.

Поэтому, кстати, конструкция, которую привел Jimmy, несколькими постингами выше, совершенно не аналогична моей, как он утверждает.

Мужики, я уже давно прошел тот этап, на котором хотелось раскидывать пальцы. Сейчас мне по-большому счету все равно, что вы пишете. Но вы хотя бы немного почитайте про типы блокировок и уровни транзакций, прежде чем наезжать.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046617
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дед Маздай

Если мой постинг был воспринят Вами, как наезд и раскидывание пальцев - это ошибка.
Я просто хотел услышать Ваше в высшей степени компетентное мнение по этому вопросу.

Услышал, но не понял, где капкан. Поясните?
...
Рейтинг: 0 / 0
Блокированные записи
    #32046624
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Jimmy
Про "пальцы" - это к Makc
...
Рейтинг: 0 / 0
Блокированные записи
    #32046633
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дед Маздай:
Вопрос был: как попроще отловить все это на клиенте через ADO (я уж сомневаюсь можно ли вообще)
Суть: открыть рекордсет (курсор лежит на клиенте поэтому adLockPessimistic не катит) и средствами ADO (БЕЗ дополнительных запросов) узнать блокированы записи на запись (масло масленное получается) на сервере или нет.

Цель: информировать юзера, что запись редактируется другим, чтобы не тратил свое драгоценное время.

Из того что я понял единственный вариант:
инициализируется контрол ->
перед открытием рекордсета начинать транзакцию
(выставив нужный уровень изоляции) при закрытии соовтетсвенно update и commit или rollback
Прав я или нет?
...
Рейтинг: 0 / 0
Блокированные записи
    #32046657
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капкан в том, что как сказано в BOL, "The READPAST lock hint applies only to transactions operating at READ COMMITTED isolation and will read only past row-level locks". А holdlock, как справедливо заметил Jimmy, соответствует уровню изоляции serializable. Или можно было на read committed попробовать заблокировать таблицу или страницы, результат был бы тот же - readpast бы эти блокировки не заметил. Получается, что Вам нужно читать блокировки из sp_lock и преобразовывать file_id:page_id:row_id в конкретную запись конкретной таблицы. Или key, если запись блокирована как запись не по row_id, а по индексному ключу. А если она вообще блокирована не на уровне записи, а лежит на заблокированной странице или в таблице? Проверять все страничные и выше блокировки и смотреть, какие записи она охватывает? Меня такой способ не слишком воодушевляет. Поэтому я и утверждал, что в SQL Server не существует надежного способа контроля блокировок на низком уровне. Философия этого дела, подразумевавшаяся разработчиками, на мой взгляд, очень проста - потому что не фига туда лазить. Ну т.е. Вы можете возмущаться на меня, на Microsoft, если хотите, но таковы правила игры. Я же не возмущаюсь, что в Жигулях при желании (и умении) можно самому карбюратор перебрать, а в иномарке под капотом все запаяно так, что не подлезешь. Так что в принципе, вариант с set lock_timeout, наверное, самый простой и надежный из того, что сейчас приходит на ум.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046663
Robert Djabarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
In a couple of apps that I wrote I was using control table with entityid, entitytypeid, actionid, spid, and userid. Prior to retrieving the specific entity for viewing/modifying I would check for the presence of a record in my control table, and if necessary modify the screen that the user would see to indicate if record modification is allowed at this time. If I happen to be the first one to view/modify a specific entity, - I would populate the control table with required values and upon completion of modifications delete the entry from the control table. During the course of testing it was determined that if an app crashed without deleting the row from the control table, nobody else would be able to access that entity. A solution was to include SPID along with other fields into control table structure, and create a scheduled task that would poll the table for ghost entries of users that do not have corresponding SPID. This app has been working successfully for the past 2.5 years. Does this approach make sense?
...
Рейтинг: 0 / 0
Блокированные записи
    #32046694
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Makc
курсор лежит на клиенте
интересно что Вы понимаете под этой фразой? Т.е. что по Вашему происходит на сервере?
На самом деле ничего. Просто клиент считал записи к себе в память и показывает их. Если кто-то хочет отредактировать запись, то по окончании редактирования записи на клиенте формируется запрос по изменению этой записи и блокировка будет только на короткий миг выполнения этого запроса. То, что запись редактируется, серверу конечно неизвестно.

Т.е. блокировки, как Вам пытаются объяснить, это внутренний механизм сервера. Вы же пытаетесь использовать их для редактирования документов. Это совсем другой уровень. Вам его придётся реализовывать самому.
А управление блокировками используйте только для обеспечения целостности данных.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046714
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Дед Маздай

Спасибо за разъяснение.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046732
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SergSuper:
Я понимаю разницу между серверным и клиентским курсором...
Этой фразой я поясняю, что не получится использовать тип блокировки adLockPessimistic (при ее использовании запись блокируется на измение с момента вызова рекордесета до его освобождения), он естественно работает только на серверных курсорах..
Как это работает на уровне сервера, я не знаю, но полагаю начинается транзакция и завершается только при освобождении рекордсета.
По поводу блокировки - внутренний механизм сервера...
В случае использования серверных курсоров уровень блокировки - средство ограничения доступа на редактирования из приложения.
Или я не прав?
Наша дискуссия все больше переходит из практической в теоретическую область...:)

Я на эту задачу уже забил, ловлю код ошибки при Update, и информирую. Такая ситуация ну очень редко возникает...
...
Рейтинг: 0 / 0
Блокированные записи
    #32046984
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рискну подытожить, к чему мы пришли. Просьба не принимать за распальцовку, скорее, так - старческое брюзжание.
Первоначальная формулировка задачи являлась порочной. Определить заблокированные записи в гриде и заблокировать на время сессии остальные - этим должен заниматься сервер БД, но не клиентское приложение. Причем не важно, говорим мы о SQL Server, об Oracle или о чем-либо в том же роде. Разные уловки существуют, но они либо громоздки, либо неудобны. Единственный надежный способ узнать, заблокирована ли запись, состоит в том, чтобы попытаться заблокировать ее самому. Да и то с известными оговорками, п.ч., повторюсь, это прерогатива сервера.
Каковы типовые способы решения с поправкой на теорию? Разумеется, клиентский курсор, на котором остановился SergSuper. (Вообще, страшный человек, ибо он достиг просветления намного раньше нас и теперь может позволить снисходительно взирать на мышиную возню, к-ю мы здесь развели). Когда каждый берет копию своего куска, работает с ней локально, а потом в доли секунды делает батчевый апдейт. Коллизии практически исключены, за одним но: прежде чем аплоадить изменения на сервер, было бы полезно предварительно знать, как они там изменились, пока я их мусолил на клиенте. В ADO есть возможность сравнить значения, но это лишний roundtrip на сервер. В идеале эта задача подобна той, к-я здесь неоднократно поднималась: как в моем клиентском гриде автоматом рефрешить только те записи, которые кто-то поменял, пока я здесь их разглядывал. С недавним выходом MS SQLSrv-NS она решается элементарно.
Второй способ состоит, очевидно, в том, чтобы делать клиенту snapshot на время транзакции не на клиенте, а на сервере. Ну т.е. вы эту картинку сняли и с ней работаете, не беспокоясь за то, что с этими данными делают остальные. (Пока не придет время закоммитить изменения - на этот счет сущ-т встроенные или пользовательские разрешители конфликтов). Это то, что умеет сейчас Oracle, но не умеет SQL Server. Мне недавно приснился вещий сон, будто в Yukon это будет. Я, правда, не досмотрел, как это реализовано. Все-таки сегментов отката в SQL Server нет, а Transaction Log - это redo-log в классическом понимании. Если бы мне приснилось, что они и before-триггеры сделают, тогда это бы точно означало, что в Юконе меняется модель журналирования. А так - не знаю, скоро увидим.
...
Рейтинг: 0 / 0
Блокированные записи
    #32046986
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MS SQLSrv-NS - что это?
...
Рейтинг: 0 / 0
Блокированные записи
    #32046990
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Notification Services. Поговаривают, что они войдут в Юкон на правах штатной ф-ти.
...
Рейтинг: 0 / 0
Блокированные записи
    #32047011
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гух.... !
давно пора....
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Блокированные записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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