Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 кто блокирует строку  [new]
Кризис
Member

Откуда:
Сообщений: 6
Привет всем!

Кто-нибудь знает, как узнать кто заблокировал строку, если точнее, то интересует hostname этого пользователя?

SQL 2005
17 июл 09, 12:16    [7428438]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3650
Кризис
Привет всем!

Кто-нибудь знает, как узнать кто заблокировал строку, если точнее, то интересует hostname этого пользователя?

SQL 2005


sp_who2 + sp_lock
17 июл 09, 12:17    [7428451]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Кризис
Member

Откуда:
Сообщений: 6
забыл уточнить, первичный ключ на таблице есть
17 июл 09, 12:19    [7428468]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Кризис
Member

Откуда:
Сообщений: 6
Ozerov,

хехе, а как это вы из sp_lock вытащите данные именно по нужной строке?
тут интереснее
17 июл 09, 12:22    [7428486]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Откуда уверенность, что заблокирована именно строка?

sys.dm_tran_locks
17 июл 09, 12:53    [7428691]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Кризис
Member

Откуда:
Сообщений: 6
поясню, человек А делает
select id,descr
from myTable(updlock)
where id=15

человек Б
тоже делает

select id,descr
from myTable(updlock)
where id=15,

он получает Окошко, типа запись занята, но надо чтоб он ещё кто именно видел

блокировки от каждого такого захвата получаются такие:
spid dbid ObjId TableName IndId Type Mode Status
220 19 1461684355 spCUSTOMERS 0 TAB IX GRANT
220 19 1461684355 spCUSTOMERS 1 KEY U GRANT
220 19 1461684355 spCUSTOMERS 1 PAG IU GRANT
17 июл 09, 13:15    [7428836]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
если глянуть sp_who2
то там по SPID можно определить hostname.
поэтому и дали 2 процедуры, вместо одной.

для спящего время бодрствования равносильно сну
17 июл 09, 13:28    [7428934]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Кризис
Member

Откуда:
Сообщений: 6
да вы меня не поняли))

у меня нет проблем с тем как узнать кто блокирует что-то в таблице, я не могу узнать кто блокирует именно ЭТУ строку
т е я не могу перейти от знания первичного ключа блокируемой строки к знанию spid-а процесса того, кто ЕЁ держит
sp_lock выдаёт данные по всем строкам, в таблце одновременно блокированны несколько строк, а меня то интересует только
select *
from myTable
where id=15
17 июл 09, 13:36    [7429011]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3650
А писать в отдельную табличку номер спида и идшник по которому идет выборка во время запроса ?
17 июл 09, 13:42    [7429051]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
select id,descr
from myTable(updlock)
where id=15,


Гм... Хотим залочить запись на все время реедактирования клиентом? Вы не с Оракла пришли?

автор
он получает Окошко, типа запись занята,


Это он сейчас получает, или Вы хотите так сделать?
17 июл 09, 13:43    [7429060]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
SET LOCK_TIMEOUT 0
go

select id,descr
from myTable(updlock)
where id=15

и ловить ошибку?

для спящего время бодрствования равносильно сну
17 июл 09, 13:43    [7429065]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
maxusmaxus
Member

Откуда:
Сообщений: 5
Алексей2003, это даст понять, что строка, которую мы хотим захватить, уже заблокирована. А Кризис интересует прежде всего КЕМ эта строка была заблокирована. Точнее, hostname того соедниения, которое заблокировало запись.
17 июл 09, 14:03    [7429206]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
SET LOCK_TIMEOUT 10000
go
select @@spid

select id,descr
from myTable(updlock)
where id=15

в другом коннекте
exec sp_who2
и смотрим спид, из первого окошка, глядим на колонку BlkBy

для спящего время бодрствования равносильно сну
17 июл 09, 14:07    [7429228]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
maxusmaxus
Алексей2003, это даст понять, что строка, которую мы хотим захватить, уже заблокирована. А Кризис интересует прежде всего КЕМ эта строка была заблокирована. Точнее, hostname того соедниения, которое заблокировало запись.


А теперь послушайте.

1. Далеко не факт, что будет заблокирована именно строка, а не диапазон строк и т.д., ибо существует такое понятие, как эскалация блокировок.

2. Hostname - это параметр строки подключения и там может быть передано все что угодно.

3. Проглядывается попытка реализовать пессимистические блокировки да еще и с выдачей информации по ним, что на мой взгляд, в корне не верно.
17 июл 09, 14:08    [7429234]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Ozerov
А писать в отдельную табличку номер спида и идшник по которому идет выборка во время запроса ?


ага и потом узнавать, кто ее заблокировал?
17 июл 09, 14:12    [7429263]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
maxusmaxus
Member

Откуда:
Сообщений: 5
pkarklin,

1. А если rowlock?
2. Ну и что, если его это устраивает
3. Почему Вы против пессимистичных блокировок?
17 июл 09, 14:13    [7429267]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
maxusmaxus
Member

Откуда:
Сообщений: 5
Алексей2003, А что мы там увидим? Я попробовал, у меня просто какое-то число. Что оно значит?
17 июл 09, 14:17    [7429306]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
maxusmaxus
pkarklin,

1. А если rowlock?
2. Ну и что, если его это устраивает
3. Почему Вы против пессимистичных блокировок?


1. Сервер сам принимает решение об эскалации, если только не "запретить" ему это делать.
2. Ничего. Просто для информации.
3. Раз ставится UPDATE лок при селекте, значит вешается транзакция, и не смотря даже на появившуюся версионность, толстые транзакции да еще и зависящие от действий клиента, есть зло для OLTP систем.

и в заключении. Здесь больше просматривается механизм "блокировок на уровне бизнес логики". Когда то я использовал следующее:

https://www.sql.ru/forum/actualthread.aspx?tid=7031#354328
17 июл 09, 14:19    [7429317]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Ozerov
Member

Откуда: Москва
Сообщений: 3650
Crimean
Ozerov
А писать в отдельную табличку номер спида и идшник по которому идет выборка во время запроса ?


ага и потом узнавать, кто ее заблокировал?

не совсем так :) при селекте делается запись в отдельную табличку со спидом и идшником. при необходимости узнать кто заблокировал строку с этим идшником, легко получаем :) Когда селект завершен, данные чистим по той строке.
17 июл 09, 14:19    [7429325]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2maxusmaxus
это число обозначает SPID, который блокирует выполнение необходимого коннекта.

для спящего время бодрствования равносильно сну
17 июл 09, 14:20    [7429329]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
maxusmaxus
Member

Откуда:
Сообщений: 5
Алексей2003,

Ну, получается, очень интересный вариант!
17 июл 09, 14:23    [7429350]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
maxusmaxus
Member

Откуда:
Сообщений: 5
pkarklin,

Ну, вот Ozerov, примерно что-то похожее предлагает на уровне идеи. У Вас уже есть реализация. Но все равно это требует дополнительных таблиц, хп, какой-то дополнительной реализации на языке программирования ит.д.
Интересно было бы, прежде всего, понять, можно ли решить задачу стандартными средствами, без каких-то дополнительных танцев с бубнами.
17 июл 09, 14:27    [7429381]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
maxusmaxus,

Задача реализации пессимистических блокировок уже, судя по приведенным селектам, реализована топикстартером. Но ему хочется большего. еще и видеть авторов пессимистических блокировок. Вот здесь уже реализация "стандартными средстами" не столь проста и в общем случае не решаема.

ЗЫ. К существующим тысячам - дестяткам тысяч объектов в бд еще пара-тройка в плюс - не такой уж и большой оверхед. Зато задача решается гараздо проше и "красивше". И без "вклинивая" в механизм блокировок сервера.
17 июл 09, 14:32    [7429437]     Ответить | Цитировать Сообщить модератору
 Re: кто блокирует строку  [new]
Кризис
Member

Откуда:
Сообщений: 6
Алексей2003,

автор
SET LOCK_TIMEOUT 10000
go
select @@spid

select id,descr
from myTable(updlock)
where id=15

в другом коннекте

exec sp_who2
и смотрим спид, из первого окошка, глядим на колонку BlkBy


СПАСИБО, вот это мне полностью подходит.
17 июл 09, 15:10    [7429736]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить