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

Откуда:
Сообщений: 279
Есть, например, такой код

begin tran
update NORTHWND.dbo.Customers set PostalCode = 5021 where CustomerID = 'PICCO'

CustomerID это первичный ключ, по нему и кластеризовано. Commit транзакции пока не делаю и из другого окошка смотрю на блокировки

select * from sys.dm_tran_locks
resource_type  resource_description  resource_associated_entity_id  request_mode
-------------- --------------------- ------------------------------ -------------
DATABASE                             0                              S
DATABASE                             0                              S
KEY            (e200dc143fe4)        72057594038648832              X
KEY            (4901b9899dc3)        72057594038845440              X
PAGE           1:187                 72057594038845440              IX
PAGE           1:192                 72057594038648832              IX
OBJECT                               21575115                       IX
KEY            (4901d6c53858)        72057594038845440              X

Вижу три KEY блокировки X, одна из них предположительно на самой строке в Customers, ещё одна скорей всего на строке индекса PostalCode (у X:KEY записей одинаковый resource_associated_entity_id, фиг знает что это значит, возможно что в индексе PostalCode висит блокирока на текущем значении 5020 и на том, которое будет новым 5021). В BOL сказано, что нужно копать в sys.partitions.hobt_id, ок заглядываю туда

select * from sys.partitions where hobt_id in (72057594038648832, 72057594038845440)
partition_id       object_id  index_id  partition_number  hobt_id            rows
------------------ ---------- --------- ----------------- ------------------ -----
72057594038648832  21575115   1         1                 72057594038648832  91
72057594038845440  21575115   4         1                 72057594038845440  91

Заглядываю в sys.indexes и вижу, что предположения приблизительно верные: две блокировки на четрёртом индексе (PostalCode) и одна на первом (PK_Customers). Ок, объекты локализовал, а как теперь строки локализовать? Как например выяснить, кого именно заблокировали, то есть как узнать, что это именно 'PICCO'? И как выяснить, соответствующие каким значениям почтовых индексов залочены строки в PostalCode? Куда дальше копать? Может есть какие-то нормальные материалы по правилам ведения раскопок?
13 ноя 11, 13:35    [11588748]     Ответить | Цитировать Сообщить модератору
 Re: Как идентифицировать залоченные строчки?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
страница известна...раскручивайте дальше, через DBCC PAGE
13 ноя 11, 13:43    [11588755]     Ответить | Цитировать Сообщить модератору
 Re: Как идентифицировать залоченные строчки?  [new]
Коляныч
Member

Откуда:
Сообщений: 279
Thanx, в общем по хэшу кое-что нашлось
DBCC TRACEON(3604)
DBCC PAGE (NORTHWND, 1, 192, 3)

Простым поиском по дампу находится нечто такое

...
Slot 26 Offset 0x1bfa Length 216

Record Type = PRIMARY_RECORD         Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 216                    
Memory Dump @0x000000000DC9DBFA

0000000000000000:   30000e00 50004900 43004300 4f000b00 †0...P.I.C.C.O... 
0000000000000010:   40f80a00 48005e00 78008e00 9e009e00 †@ø..H.^.x.Ž.ž.ž. 
0000000000000020:   a600b400 c600d800 50006900 63006300 †¦.´.Æ.Ø.P.i.c.c. 
0000000000000030:   6f006c00 6f002000 75006e00 64002000 †o.l.o. .u.n.d. . 
0000000000000040:   6d006500 68007200 47006500 6f007200 †m.e.h.r.G.e.o.r. 
0000000000000050:   67002000 50006900 70007000 73005300 †g. .P.i.p.p.s.S. 
0000000000000060:   61006c00 65007300 20004d00 61006e00 †a.l.e.s. .M.a.n. 
0000000000000070:   61006700 65007200 47006500 69007300 †a.g.e.r.G.e.i.s. 
0000000000000080:   6c007700 65006700 20003100 34005300 †l.w.e.g. .1.4.S. 
0000000000000090:   61006c00 7a006200 75007200 67003500 †a.l.z.b.u.r.g.5. 
00000000000000A0:   30003200 31004100 75007300 740072000.2.1.A.u.s.t.r. 
00000000000000B0:   69006100 36003500 36003200 2d003900 †i.a.6.5.6.2.-.9. 
00000000000000C0:   37003200 32003600 35003600 32002d00 †7.2.2.6.5.6.2.-. 
00000000000000D0:   39003700 32003300 †††††††††††††††††††9.7.2.3.         

Slot 26 Column 1 Offset 0x4 Length 10 Length (physical) 10

CustomerID = PICCO                   

Slot 26 Column 2 Offset 0x28 Length 32 Length (physical) 32

CompanyName = Piccolo und mehr       

Slot 26 Column 3 Offset 0x48 Length 22 Length (physical) 22

ContactName = Georg Pipps            

Slot 26 Column 4 Offset 0x5e Length 26 Length (physical) 26

ContactTitle = Sales Manager         

Slot 26 Column 5 Offset 0x78 Length 22 Length (physical) 22

Address = Geislweg 14                

Slot 26 Column 6 Offset 0x8e Length 16 Length (physical) 16

City = Salzburg                      

Slot 26 Column 7 Offset 0x0 Length 0 Length (physical) 0

Region = [NULL]                      

Slot 26 Column 8 Offset 0x9e Length 8 Length (physical) 8

PostalCode = 5021                    

Slot 26 Column 9 Offset 0xa6 Length 14 Length (physical) 14

Country = Austria                    

Slot 26 Column 10 Offset 0xb4 Length 18 Length (physical) 18

Phone = 6562-9722                    

Slot 26 Column 11 Offset 0xc6 Length 18 Length (physical) 18

Fax = 6562-9723                      

Slot 26 Offset 0x0 Length 0 Length (physical) 0

KeyHashValue = (e200dc143fe4)        
...

Это первая блокировка по кластерному индексу. А вот с двумя другими по некластерному чуть хуже

DBCC PAGE (NORTHWND, 1, 187, 3)
Возвращает рекордсет, одна из колонок которого называется KeyHashValue, в ней с одним из искомых хэшей есть строчка

FileId PageId      Row    Level  PostalCode (key) CustomerID (key) KeyHashValue
------ ----------- ------ ------ ---------------- ---------------- ----------------
1      187         47     0      5021             PICCO            (4901b9899dc3)

но другой строки с хэшем 4901d6c53858 чёт нету. То есть я вижу новую вставленную запись (новое предполагаемое значение PostalCode для незавершенной транзакции), но не вижу старой строчки с PostalCode 5020, то есть знаю на что меняют, но не знаю что тут было до начала замены. Наверное, sql её сразу грохает и при откате транзакции достаёт из log файла. А блокировку держит, чтобы конкурирующие транзакции ничего с таким же хэшем в этот индекс не воткнули
13 ноя 11, 15:58    [11588943]     Ответить | Цитировать Сообщить модератору
 Re: Как идентифицировать залоченные строчки?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Коляныч
но не вижу старой строчки с PostalCode 5020
Всё видно:
DBCC PAGE (NORTHWND, 1, 187, 1)

OffTop:
USE NORTHWND
GO
SELECT	L.*
FROM	          dbo.Customers L WITH(NoLock)
	LEFT JOIN dbo.Customers R WITH(ReadPast) ON R.CustomerID = L.CustomerID
WHERE	R.CustomerID IS NULL
Через Exists лучше
14 ноя 11, 16:33    [11594496]     Ответить | Цитировать Сообщить модератору
 Re: Как идентифицировать залоченные строчки?  [new]
Коляныч
Member

Откуда:
Сообщений: 279
Mnior
Коляныч
но не вижу старой строчки с PostalCode 5020
Всё видно:
DBCC PAGE (NORTHWND, 1, 187, 1)


Спасибо. Кажись GHOST_INDEX_RECORD в нём это как раз и есть уже удалённые

Mnior
OffTop:
USE NORTHWND
GO
SELECT	L.*
FROM	          dbo.Customers L WITH(NoLock)
	LEFT JOIN dbo.Customers R WITH(ReadPast) ON R.CustomerID = L.CustomerID
WHERE	R.CustomerID IS NULL
Через Exists лучше

Супер! Очень интересный селектик, спасибо, возьму на вооружение

Вообще задумка была такая: при пиковых нагрузках запустить выборку из sys.dm_tran_locks и через пару секунд снова ту же выборку. KEY блокировки X, оказавшиеся в обоих выборках (отстоящих друг от друга на 2 секунды) сразу укажут на транзакции, захватившие и долго не возвращающие назад ресурсы, то есть на источник проблем. Чтобы сдампить всё в удобоваримые файлы и сидеть уже дальше глазами разбираться, искать виновника в доставшемся OLTP наследстве...

Но при первой же пиковой нагрузке дампы у меня захлебнулись - вывалили десяток тысяч залипших X-ов на десятках индексов по куче таблиц, со всеми этими тоннами дампов разбираться пока что эмоционального настроения нет.
14 ноя 11, 19:54    [11596022]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить