|
|
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Как при открытии рекорсета на клиенте (ADO 2.7) Определить блокированы другим юзером записи или нет (желательно также узнать тип блокировки). Проблема: UpdateBatch с группой записей не проходит при если записе были изменены... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 13:51:50 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 14:54:51 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Дед Маздай В транзакции можно заблокировать записи не используя операцию обновления. Вот конструкция, аналогичная Вашей: Код: plaintext 1. 2. 3. Никто не сможет изменить записи, попавшие в диапазон запроса до завершения транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 15:15:30 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Спасибо... Но вопрос открыт: Update не через хп, а с клиента через ADO, так вот, при открытии usercontrol'a, хотелось бы знать, блокирована запись (записи) другими процессами или нет, если блокированы то вывести рекордсет с ReadOnly а контролы залочить, чтоб юзер зря не тыкался... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 15:28:51 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
смотри master..sysprocesess,master..locks,master..lockinfo// ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 15:34:14 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Mice это понятно, но каждый раз при открытии рекордсета смотреть системные таблицы... Неужели попроще нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 15:51:03 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Вообще говоря, блокировки являются внутренним механизмом сервера для обеспечения целостности данных. Если Вы хотите сами управлять ими, то это все равно, что сказать, почему я не могу, например, полностью держать под контролем план выполнения запроса? Мне не нравится план, который строит сервер, как подсунуть оптимизатору мой собственный? Существует базовый встроенный функционал как данность. Если хочется управлять абсолютно всем - проще написать свой собственный сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 16:03:33 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Дед Маздай: Я НЕ ХОЧУ управлять блокировками на сервере, я хочу знать блокирована запись или нет и исходя из этого решать свои задачи... Отлавливать код ошибки при попытки апдейта не самый лучший способ.. ЗЫ. И не надо пальцы раскидывать, не можешь помочь - неча постить.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 16:15:06 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Вот тут Dankov советует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 16:23:58 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Glory: Спасибо, то что надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 16:31:58 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Не нравится - не ешьте, но зачем плеваться? Да и на брудершафт мы с Вами, в общем-то, не пили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 16:51:48 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Извините за фамильярность, но пожалуйста читайте вопрос и отвечайте по теме, а не тыкайте носом - Чувак не нравится пиши свой сервер (вольный перевод Вашего сообщения) Все когда-то начинали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 17:08:52 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Ну на самом деле Вы правильно сделали, что извинились, потому что рецепт 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, несколькими постингами выше, совершенно не аналогична моей, как он утверждает. Мужики, я уже давно прошел тот этап, на котором хотелось раскидывать пальцы. Сейчас мне по-большому счету все равно, что вы пишете. Но вы хотя бы немного почитайте про типы блокировок и уровни транзакций, прежде чем наезжать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 17:35:09 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Дед Маздай Если мой постинг был воспринят Вами, как наезд и раскидывание пальцев - это ошибка. Я просто хотел услышать Ваше в высшей степени компетентное мнение по этому вопросу. Услышал, но не понял, где капкан. Поясните? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 17:43:41 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Jimmy Про "пальцы" - это к Makc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 18:03:51 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Дед Маздай: Вопрос был: как попроще отловить все это на клиенте через ADO (я уж сомневаюсь можно ли вообще) Суть: открыть рекордсет (курсор лежит на клиенте поэтому adLockPessimistic не катит) и средствами ADO (БЕЗ дополнительных запросов) узнать блокированы записи на запись (масло масленное получается) на сервере или нет. Цель: информировать юзера, что запись редактируется другим, чтобы не тратил свое драгоценное время. Из того что я понял единственный вариант: инициализируется контрол -> перед открытием рекордсета начинать транзакцию (выставив нужный уровень изоляции) при закрытии соовтетсвенно update и commit или rollback Прав я или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 18:28:59 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Капкан в том, что как сказано в 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, наверное, самый простой и надежный из того, что сейчас приходит на ум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2002, 20:46:29 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
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? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2002, 00:47:14 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Makc курсор лежит на клиенте интересно что Вы понимаете под этой фразой? Т.е. что по Вашему происходит на сервере? На самом деле ничего. Просто клиент считал записи к себе в память и показывает их. Если кто-то хочет отредактировать запись, то по окончании редактирования записи на клиенте формируется запрос по изменению этой записи и блокировка будет только на короткий миг выполнения этого запроса. То, что запись редактируется, серверу конечно неизвестно. Т.е. блокировки, как Вам пытаются объяснить, это внутренний механизм сервера. Вы же пытаетесь использовать их для редактирования документов. Это совсем другой уровень. Вам его придётся реализовывать самому. А управление блокировками используйте только для обеспечения целостности данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2002, 09:25:23 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 Дед Маздай Спасибо за разъяснение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2002, 10:12:56 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
2 SergSuper: Я понимаю разницу между серверным и клиентским курсором... Этой фразой я поясняю, что не получится использовать тип блокировки adLockPessimistic (при ее использовании запись блокируется на измение с момента вызова рекордесета до его освобождения), он естественно работает только на серверных курсорах.. Как это работает на уровне сервера, я не знаю, но полагаю начинается транзакция и завершается только при освобождении рекордсета. По поводу блокировки - внутренний механизм сервера... В случае использования серверных курсоров уровень блокировки - средство ограничения доступа на редактирования из приложения. Или я не прав? Наша дискуссия все больше переходит из практической в теоретическую область...:) Я на эту задачу уже забил, ловлю код ошибки при Update, и информирую. Такая ситуация ну очень редко возникает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2002, 10:44:11 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Рискну подытожить, к чему мы пришли. Просьба не принимать за распальцовку, скорее, так - старческое брюзжание. Первоначальная формулировка задачи являлась порочной. Определить заблокированные записи в гриде и заблокировать на время сессии остальные - этим должен заниматься сервер БД, но не клиентское приложение. Причем не важно, говорим мы о SQL Server, об Oracle или о чем-либо в том же роде. Разные уловки существуют, но они либо громоздки, либо неудобны. Единственный надежный способ узнать, заблокирована ли запись, состоит в том, чтобы попытаться заблокировать ее самому. Да и то с известными оговорками, п.ч., повторюсь, это прерогатива сервера. Каковы типовые способы решения с поправкой на теорию? Разумеется, клиентский курсор, на котором остановился SergSuper. (Вообще, страшный человек, ибо он достиг просветления намного раньше нас и теперь может позволить снисходительно взирать на мышиную возню, к-ю мы здесь развели). Когда каждый берет копию своего куска, работает с ней локально, а потом в доли секунды делает батчевый апдейт. Коллизии практически исключены, за одним но: прежде чем аплоадить изменения на сервер, было бы полезно предварительно знать, как они там изменились, пока я их мусолил на клиенте. В ADO есть возможность сравнить значения, но это лишний roundtrip на сервер. В идеале эта задача подобна той, к-я здесь неоднократно поднималась: как в моем клиентском гриде автоматом рефрешить только те записи, которые кто-то поменял, пока я здесь их разглядывал. С недавним выходом MS SQLSrv-NS она решается элементарно. Второй способ состоит, очевидно, в том, чтобы делать клиенту snapshot на время транзакции не на клиенте, а на сервере. Ну т.е. вы эту картинку сняли и с ней работаете, не беспокоясь за то, что с этими данными делают остальные. (Пока не придет время закоммитить изменения - на этот счет сущ-т встроенные или пользовательские разрешители конфликтов). Это то, что умеет сейчас Oracle, но не умеет SQL Server. Мне недавно приснился вещий сон, будто в Yukon это будет. Я, правда, не досмотрел, как это реализовано. Все-таки сегментов отката в SQL Server нет, а Transaction Log - это redo-log в классическом понимании. Если бы мне приснилось, что они и before-триггеры сделают, тогда это бы точно означало, что в Юконе меняется модель журналирования. А так - не знаю, скоро увидим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2002, 22:36:37 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
MS SQLSrv-NS - что это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2002, 22:52:07 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Notification Services. Поговаривают, что они войдут в Юкон на правах штатной ф-ти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2002, 23:41:22 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
гух.... ! давно пора.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2002, 08:10:53 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за разъяснение... Будем ждать Yukon и учить матчасть :) P.s. Дед Маздай отдельное спасибо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2002, 08:50:54 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
C этим NS непонятки. Правильно ли я понял, что NS может оправить сообщение на e-mail, пейджер, сотовый телефон, куда угодно, кроме клиентской программы, не умеющей быть a) SMTP-сервером, б) WEB-сервером и в) не обращающейся к почтовому сервера за почтой хотя бы раз в минуту? Очень полезный сервис нотификации! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2002, 09:07:13 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Ну нет, нет. Категорически не согласен. А как же .NET Alerts? Пожалуй, в чем Вы правы - это необходим хороший брокер, дабы не привязывать все ручками. Но это вопрос ближайшего времени, я полагаю. Ибо если MS проталкивает Юконовский сторидж на уровень ядра ОС ( как нам обещает компьютерная пресса ), то по идее каждое окно в размазанной по многим серверам Windows должно в будущем получать сообщение по этому механизму. Вообще получается чертовски интересная по замыслу вещь. М.б. вынесем обсуждение SQL-NS в отдельную ветку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2002, 21:30:43 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
а бетта релизов Yukon еще не появилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2002, 21:59:15 |
|
||
|
Блокированные записи
|
|||
|---|---|---|---|
|
#18+
Бр-р. Это хороший вопрос. Давайте посчитаем. Значит, SQL Server 6.5 вышел, дай Бог памяти, в апреле 96 г. Семерку они переписали, почитай, заново, и выпустили в декабре 98 г., т.е. через 2 г. 8 мес. Yukon, судя по тому, что туда закладывают, будет им стоить примерно столько же, если не больше. Положим, 3 года. Отсчитываем этот период от даты выхода SQL Server 2000 - получаем (плюс/минус) сентябрь 2003. Это значит, что, если ничего не случится, 1-ю бету они должны выпустить в конце этого / начале след.года. Ну а поскольку, как каждый наверняка убедился на собственном опыте, сроки проектов сдвигаются скорее в плюс, чем в минус, то это скорее январь 2003, чем декабрь 2002. Примем во внимание, что во времена семерки они отвлекались только на сервис-паки к 6.х, а сейчас они параллельно пишут и SQL Server CE 2.0, и 64-битный SQL Server 2000. Получается февраль-март 2003 г. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2002, 22:58:01 |
|
||
|
|

start [/forum/topic.php?all=1&fid=46&tid=1820709]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 337ms |

| 0 / 0 |
