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

Откуда: Мурманск
Сообщений: 27465
есть 2 запроса к одной таблице на изменение

скажем Т
в ней есть 4 поля, период, товар, склад и количество

первая транзакция устанавливает блокировку по ключу
период - 20.02.2013, склад - 1, товар 1

вторая транзакция устанавливает блокировку по ключу
период - 20.02.2013, склад - 1, товар 2

в такой комбинации все работает, однако если я делаю

первая транзакция устанавливает блокировку по ключу
период - 20.02.2013, склад - 1, товар 1

вторая транзакция устанавливает блокировку по ключу
период - 20.02.2013, склад - 2, товар 1

у меня транзакции встают в очередь

по sp_lock я вижу, что идет обращение к одному ключу ресурса, но не понимаю в чем загвоздка
почему разные товары по одному складу прокатывают, а один товар по разным складам нет, хотя казалось бы должно все работать
22 фев 13, 11:35    [13965705]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сергей84
почему разные товары по одному складу прокатывают, а один товар по разным складам нет, хотя казалось бы должно все работать

sp_who покажет, какой коннект каким коннектом блокирован
22 фев 13, 11:39    [13965737]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Glory
Сергей84
почему разные товары по одному складу прокатывают, а один товар по разным складам нет, хотя казалось бы должно все работать

sp_who покажет, какой коннект каким коннектом блокирован

это я знаю, т.к. в базе только 2 моих коннекта
на одном я запускаю транзакцию и накладываю блокировку и оставляю висеть, а вторым конектом проверяю паралельную работу
может я не совсем внятно объясняю
мне нужно знать не кто, а почему грубо говоря
update t set rs = 10 where fl1 = @a1 and fl2 = @b1 and fl3 = @c1
update t set rs = 10 where fl1 = @a1 and fl2 = @b2 and fl3 = @c1
работает, а
update t set rs = 10 where fl1 = @a1 and fl2 = @b1 and fl3 = @c1
update t set rs = 10 where fl1 = @a2 and fl2 = @b1 and fl3 = @c1
нет

этими апдейтами должны блокироватсья разные записи и идти паралельно, в одном случае так и происходит, а во втором нет и они встают в очередь

в sp_lock видно блокировку где фигурирует один и тот же ресурс, вот я и хочу понять, если обрабатываемые строки разные - как получается ресурс у них один?
22 фев 13, 11:56    [13965875]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей84
скажем Т
в ней есть 4 поля, период, товар, склад и количество

А теперь то же самое, но на T-SQL (create table и к ней все индексы и констрейнты).
22 фев 13, 11:59    [13965900]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сергей84
это я знаю, т.к. в базе только 2 моих коннекта

И что вам тогда мешает увидеть
- какие блокировки уже существуют
- какие блокировки кто ожидает

Сергей84
этими апдейтами должны блокироватсья разные записи и идти паралельно

Должны кому и почему ?

Сергей84
в sp_lock видно блокировку где фигурирует один и тот же ресурс, вот я и хочу понять, если обрабатываемые строки разные - как получается ресурс у них один?

У вас там что одна единственная блокировка что ли ?
22 фев 13, 11:59    [13965902]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
Сергей84
скажем Т
в ней есть 4 поля, период, товар, склад и количество

А теперь то же самое, но на T-SQL (create table и к ней все индексы и констрейнты).

+ напишите, какой ключ ресурса блокируется.
22 фев 13, 12:11    [13965988]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Гость333
Сергей84
скажем Т
в ней есть 4 поля, период, товар, склад и количество

А теперь то же самое, но на T-SQL (create table и к ней все индексы и констрейнты).

если бы было все так просто - я бы на нем и выложил, но все гораздо сложней
таблицы куда больше и запросы куда сложней
в примере я указал лишь поля-ключи по которым накладываются ограничения, которые никак не должны пересекаться
22 фев 13, 13:29    [13966619]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Glory
И что вам тогда мешает увидеть
- какие блокировки уже существуют
- какие блокировки кто ожидает

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

Glory
Должны кому и почему ?

так написано в умных книжках и статьях по управлению блокировками :)

Glory
У вас там что одна единственная блокировка что ли ?

вот мои блокировки

61 13 1211971494 2 KEY (122b75f264b2) X GRANT
61 13 1211971494 2 PAG 1:41736 IX GRANT
61 13 1211971494 1 PAG 1:41664 IX GRANT
61 13 1211971494 4 KEY (f55aeb203768) X GRANT
61 13 1211971494 3 PAG 1:44002 IX GRANT
61 13 1211971494 4 PAG 1:44289 IX GRANT
61 13 1211971494 3 KEY (9eb6cf863ddb) X GRANT
61 13 1211971494 0 TAB IX GRANT
61 13 1211971494 1 KEY (5752969788b5) X GRANT
68 13 1211971494 4 KEY (178d0e6e3f43) X GRANT
68 13 1211971494 4 KEY (d6e45270b63a) X GRANT
68 13 1211971494 4 KEY (f7b920e1fbff) X GRANT
68 13 1211971494 2 KEY (9fa6ec697b2f) X GRANT
68 13 1211971494 2 KEY (7f92c2e6bf93) X GRANT
68 13 1211971494 4 KEY (eec165f9da4f) X GRANT
68 13 1211971494 2 PAG 1:41736 IX GRANT
68 13 1211971494 4 PAG 1:44290 IX GRANT
68 13 1211971494 2 KEY (66ea87fe9e23) X GRANT
68 13 1211971494 2 KEY (5ecfb077f256) X GRANT
68 13 1211971494 3 PAG 1:44003 IX GRANT
68 13 1211971494 3 PAG 1:44004 IX GRANT
68 13 1211971494 3 PAG 1:44002 IS GRANT
68 13 1211971494 1 PAG 1:41664 IX GRANT
68 13 1211971494 1 KEY (d9d22d2328d8) X GRANT
68 13 1211971494 3 KEY (b5227738cb6a) X GRANT
68 13 1211971494 3 KEY (9eb6cf863ddb) S WAIT
68 13 1211971494 1 KEY (39e603acec64) X GRANT
68 13 1211971494 3 PAG 1:49286 IX GRANT
68 13 1211971494 1 KEY (18bb713da1a1) X GRANT
68 13 1211971494 1 KEY (209e46b4cdd4) X GRANT
68 13 1211971494 3 KEY (088e0960ace2) X GRANT
68 13 1211971494 0 TAB IX GRANT
68 13 1211971494 3 KEY (9db60410c16a) X GRANT
68 13 1211971494 3 KEY (aa3f391e73fb) X GRANT

если быть точнее, то проблема вся вот тут
61 13 1211971494 3 KEY (9eb6cf863ddb) X GRANT
68 13 1211971494 3 KEY (9eb6cf863ddb) S WAIT

меня интересует как этот ключ интерпритировать
почему когда я блокирую разные товары на одном слкаде - он не повторяется
когда же я блокирую один и тот же товар, но по разным складам - появляется его повтороние
22 фев 13, 13:34    [13966666]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей84
61 13 1211971494 3 KEY (9eb6cf863ddb) X GRANT
68 13 1211971494 3 KEY (9eb6cf863ddb) S WAIT

меня интересует как этот ключ интерпритировать

У вас блокировка в базе данных 13 на объекте с object_id = 1211971494, на индексе с index_id = 3. Хэш-значение ключа индекса = (9eb6cf863ddb).
Дальнейшие разъяснения — после того, как увижу DDL таблицы и индекса.
22 фев 13, 13:40    [13966711]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
CREATE TABLE [dbo].[_AccumRgT13169](
	[_Period] [datetime] NOT NULL,
	[_Fld13160RRef] [binary](16) NOT NULL,
	[_Fld13158RRef] [binary](16) NOT NULL,
	[_Fld13879RRef] [binary](16) NOT NULL,
	[_Fld13159RRef] [binary](16) NOT NULL,
	[_Fld13162RRef] [binary](16) NOT NULL,
	[_Fld13163] [numeric](21, 3) NOT NULL,
	[_Fld13164] [numeric](21, 2) NOT NULL,
	[_Fld13165] [numeric](21, 3) NOT NULL,
	[_Fld13166] [numeric](21, 2) NOT NULL,
	[_Splitter] [numeric](10, 0) NOT NULL
) ON [PRIMARY]

CREATE UNIQUE CLUSTERED INDEX [_Accum13169_ByDims_TRRRRRN] ON [dbo].[_AccumRgT13169]
(
	[_Period] ASC,
	[_Fld13160RRef] ASC,
	[_Fld13158RRef] ASC,
	[_Fld13879RRef] ASC,
	[_Fld13159RRef] ASC,
	[_Fld13162RRef] ASC,
	[_Splitter] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [_Accum13169_ByDims14842_TR] ON [dbo].[_AccumRgT13169]
(
	[_Period] ASC,
	[_Fld13159RRef] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
22 фев 13, 13:40    [13966714]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
ой... прошу прощения не ту таблицу привел.

CREATE TABLE [dbo].[_AccumRg13157](
	[_Period] [datetime] NOT NULL,
	[_RecorderTRef] [binary](4) NOT NULL,
	[_RecorderRRef] [binary](16) NOT NULL,
	[_LineNo] [numeric](9, 0) NOT NULL,
	[_Active] [binary](1) NOT NULL,
	[_RecordKind] [numeric](1, 0) NOT NULL,
	[_Fld13160RRef] [binary](16) NOT NULL,
	[_Fld13158RRef] [binary](16) NOT NULL,
	[_Fld13879RRef] [binary](16) NOT NULL,
	[_Fld13159RRef] [binary](16) NOT NULL,
	[_Fld13162RRef] [binary](16) NOT NULL,
	[_Fld13163] [numeric](15, 3) NOT NULL,
	[_Fld13164] [numeric](15, 2) NOT NULL,
	[_Fld13165] [numeric](15, 3) NOT NULL,
	[_Fld13166] [numeric](15, 2) NOT NULL
) ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [_Accum13157_ByDims14842_RTRN] ON [dbo].[_AccumRg13157]
(
	[_Fld13159RRef] ASC,
	[_Period] ASC,
	[_RecorderTRef] ASC,
	[_RecorderRRef] ASC,
	[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [_Accum13157_ByDims14843_RTRN] ON [dbo].[_AccumRg13157]
(
	[_Fld13160RRef] ASC,
	[_Period] ASC,
	[_RecorderTRef] ASC,
	[_RecorderRRef] ASC,
	[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

CREATE UNIQUE CLUSTERED INDEX [_Accum13157_ByPeriod_TRN] ON [dbo].[_AccumRg13157]
(
	[_Period] ASC,
	[_RecorderTRef] ASC,
	[_RecorderRRef] ASC,
	[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [_Accum13157_ByRecorder_RN] ON [dbo].[_AccumRg13157]
(
	[_RecorderTRef] ASC,
	[_RecorderRRef] ASC,
	[_LineNo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
22 фев 13, 13:48    [13966782]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей84,

Это 1С? Кластерные индексы шириной по 93 байта — это круто :-)
Ещё забыл спросить — который из этих индексов имеет index_id = 3, и какой текст у команды UPDATE?
22 фев 13, 13:52    [13966809]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Гость333,

она самая, сам не люблю как она некоторые моменты хреначит в СУБД
индекс - _Accum13157_ByDims14843_RTRN
_Fld13160RRef - товар

а вот апдейт отловить - я попробую но чую будет очень крута
22 фев 13, 14:00    [13966874]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Сергей84
меня интересует как этот ключ интерпритировать
почему когда я блокирую разные товары на одном слкаде - он не повторяется
когда же я блокирую один и тот же товар, но по разным складам - появляется его повтороние

https://www.sql.ru/forum/actualthread.aspx?tid=926289&hl=lockres
22 фев 13, 14:08    [13966931]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Сергей84,

Сама по себе команда "update t set rs = 10 where fl1 = @a1 and fl2 = @b1 and fl3 = @c1" не накладывает S-блокировок. Так что либо апдейт сложнее, чем здесь представлено, либо блокировку накладывает какая-то другая команда, ранее выполненная в этой транзакции.
22 фев 13, 14:55    [13967280]     Ответить | Цитировать Сообщить модератору
 Re: можно ли посмотреть почему происходит блокировка исходя из значения ключа ресурса?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Гость333,

я понял про что вы, да действительно, там идет запрос проверка
прошу прощение - так будет вернее

update t set rs = 10 where fl1 = @a1 and fl2 = @b1 and fl3 = @c1
select rs from t where fl1 = @a1 and fl2 = @b1 and fl3 = @c1


update t set rs = 10 where fl1 = @a2 and fl2 = @b1 and fl3 = @c1
select rs from t where fl1 = @a2 and fl2 = @b1 and fl3 = @c1

а сама блокировка падает на 2-м селекте
select rs from t where fl1 = @a2 and fl2 = @b1 and fl3 = @c1
получается, что второй запрос пытается сделать выборку по заблокированному индексу?
если так, то как же быть, ведь мы не можем отказаться от индекса и бросить селект в тейбл скан
а поскольку индекс у нас по @b, и в обоих транзакциях идет выборка @b1, но почему блокируются все @b1, ведь @a у нас различные О_о
22 фев 13, 15:46    [13967700]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить