|
|
|
Блокированные записи
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32046984&tid=1820709]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 306ms |

| 0 / 0 |
