|
DeadLock
|
|||
---|---|---|---|
#18+
Дано: Microsoft SQL Server 2012 (SP4-GDR) (KB4583465) - 11.0.7507.2 (X64) Nov 1 2020 00:48:37 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor) Табличка (1.5 млн записей): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Граф: <deadlock> <victim-list> <victimProcess id="processd3f90d0c8" /> </victim-list> <process-list> <process id="processd3f90d0c8" taskpriority="0" logused="0" waitresource="PAGE: 5:1:66942918 " waittime="7999" ownerId="1926158621" transactionname="UPDATE" lasttranstarted="2021-11-23T14:00:09.610" XDES="0x6cb7343a8" lockMode="U" schedulerid="16" kpid="5140" status="suspended" spid="2474" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2021-11-23T14:00:04.163" lastbatchcompleted="2021-11-23T14:00:04.163" lastattention="1900-01-01T00:00:00.163" clientapp="SQLAgent - TSQL JobStep (Job 0x82306FD409770E46904B4506C3629CE4 : Step 2)" hostname="NEM-PDM-01" hostpid="5620" loginname="NEM\admin_sql_pdm" isolationlevel="read committed (2)" xactid="1926158621" currentdb="7" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056"> <executionStack> <frame procname="INTEGRATION.dbo.GAL_CREATE_CODEREQUEST_NEW_02D2" line="91" stmtstart="9180" stmtend="9596" sqlhandle="0x03000700e54db542359f110147ad000001000000000000000000000000000000000000000000000000000000"> UPDATE Search.dbo.ART_PARAMS SET STATUS='+' where STATUS='+++' -- </frame> <frame procname="adhoc" line="4" stmtstart="162" sqlhandle="0x01000700e9c23a2040c6b5ce0700000000000000000000000000000000000000000000000000000000000000"> exec GAL_CREATE_CODEREQUEST_NEW_02D2 </frame> </executionStack> <inputbuf> exec GAL_CREATE_CODEREQUEST_NEW_02D2 </inputbuf> </process> <process id="processd3f064cf8" taskpriority="0" logused="100992" waitresource="PAGE: 5:1:66942916 " waittime="4952" ownerId="1926129050" transactionname="user_transaction" lasttranstarted="2021-11-23T13:59:57.573" XDES="0x416c396a8" lockMode="IU" schedulerid="11" kpid="7048" status="suspended" spid="695" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2021-11-23T14:00:12.757" lastbatchcompleted="2021-11-23T14:00:12.757" lastattention="1900-01-01T00:00:00.757" hostpid="468" loginname="sysdba" isolationlevel="read uncommitted (1)" xactid="1926129050" currentdb="5" lockTimeout="4294967295" clientoption1="32" clientoption2="16416"> <executionStack> <frame procname="adhoc" line="1" stmtstart="50" sqlhandle="0x02000000369e5a02b9522aaf10631005de1c1d05920e689f0000000000000000000000000000000000000000"> UPDATE [ART_PARAMS] set Код: _INFOR_ERP 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
на страницу PAGE: 5:1:6694291 6 получил mode="U", затребовал получение lockMode="U" на страницу PAGE: 5:1:6694291 8 - тут всё понятно!!! Процесс process id="processd3f064 cf8 , spid="695" обновляет по первичному кластерному индексу одну запись: Код: sql 1.
причём на страницу PAGE: 5:1:6694291 8 получил mode="IX" и затребовал на страницу PAGE: 5:1:6694291 6 получение lockMode="IU". Как бы DeadLock налицо. Вопрос: нафига process id="processd3f064 cf8 , spid="695" получил mode="IX" на страницу PAGE: 5:1:6694291 8 ведь он обновляет запись по кластерному индексу ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 10:09 |
|
DeadLock
|
|||
---|---|---|---|
#18+
PaulWist, надо смотреть - что находится на этой странице. Иначе можно долго гадать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 10:46 |
|
DeadLock
|
|||
---|---|---|---|
#18+
Владислав Колосов, Как посмотреть и что надо искать??? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 10:52 |
|
DeadLock
|
|||
---|---|---|---|
#18+
PaulWist Вопрос: нафига process id="processd3f064 cf8 , spid="695" получил mode="IX" на страницу PAGE: 5:1:6694291 8 ведь он обновляет запись по кластерному индексу ??? А вы знаете для чего нужны I(ntent) lock-и? При наложении любой "обычной" блокировки, на все объекты большей гранулярности накладывают соответствующие Intent блокировки. Например, при X блокировки на ключ, накладываются IX блокировки на страницу и таблицы. Нужно это для того, чтобы не было необходимости сравнивать блокировки разной гранулярности. Пример 1-й процесс запустил массовое удаление записей, и SQL Engine "решил" не блокировать отдельные записи, а блокировать целиком страницы, т.е. накладывать X блокировки на PAGE 2-й процесс запустил изменение 1 записи по ключу, и хочет наложить X блокировку на KEY Если бы не было Intent блокировок, 2-му процессу пришлось бы проверять наличие несовместимый блокировок всех уровней (PAGE, TABLE), а 1-му, помимо проверки верхних уровней (TABLE), нужно проверять все "подобъекты", т.е. нет ли несовместимых KEY блокировок на каждой записи на странице? Что будет, если какой-то процесс захочет наложить блокировку на уровне терабайтной таблицы можно приставить. Вместо этого, любой lock дублируется I lock на уровне выше, и все сравнения допустимости блокировок сводятся к проверки в рамках конкретного объекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 11:11 |
|
DeadLock
|
|||
---|---|---|---|
#18+
msLex Пример 1-й процесс запустил массовое удаление записей, и SQL Engine "решил" не блокировать отдельные записи, а блокировать целиком страницы, т.е. накладывать X блокировки на PAGE 2-й процесс запустил изменение 1 записи по ключу, и хочет наложить X блокировку на KEY Если бы не было Intent блокировок, 2-му процессу пришлось бы проверять наличие несовместимый блокировок всех уровней (PAGE, TABLE), а 1-му, помимо проверки верхних уровней (TABLE), нужно проверять все "подобъекты", т.е. нет ли несовместимых KEY блокировок на каждой записи на странице? Что будет, если какой-то процесс захочет наложить блокировку на уровне терабайтной таблицы можно приставить. Вместо этого, любой lock дублируется I lock на уровне выше, и все сравнения допустимости блокировок сводятся к проверки в рамках конкретного объекта. ОК. Давайте рассмотрим "Ваш пример" на конкретном, приведенном deadlock, первый процесс (тот который слева, отстреленный), обновляет сканируя таблицу, те идёт по листовому уровню кластерного индекса получая U блокировку и натыкается на страницу листового уровня, которую заблокировал IX второй процесс обновляющий по кластерному ключу. По логике, второй процесс должен был наложить IX блокировку на таблицу, но не как не на листовую страницу. Вот нафига, второму процессу блокировать две страницы листового уровня??? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 11:39 |
|
DeadLock
|
|||
---|---|---|---|
#18+
PaulWist msLex Пример 1-й процесс запустил массовое удаление записей, и SQL Engine "решил" не блокировать отдельные записи, а блокировать целиком страницы, т.е. накладывать X блокировки на PAGE 2-й процесс запустил изменение 1 записи по ключу, и хочет наложить X блокировку на KEY Если бы не было Intent блокировок, 2-му процессу пришлось бы проверять наличие несовместимый блокировок всех уровней (PAGE, TABLE), а 1-му, помимо проверки верхних уровней (TABLE), нужно проверять все "подобъекты", т.е. нет ли несовместимых KEY блокировок на каждой записи на странице? Что будет, если какой-то процесс захочет наложить блокировку на уровне терабайтной таблицы можно приставить. Вместо этого, любой lock дублируется I lock на уровне выше, и все сравнения допустимости блокировок сводятся к проверки в рамках конкретного объекта. ОК. Давайте рассмотрим "Ваш пример" на конкретном, приведенном deadlock, первый процесс (тот который слева, отстреленный), обновляет сканируя таблицу, те идёт по листовому уровню кластерного индекса получая U блокировку и натыкается на страницу листового уровня, которую заблокировал IX второй процесс обновляющий по кластерному ключу. По логике, второй процесс должен был наложить IX блокировку на таблицу, но не как не на листовую страницу. Вот нафига, второму процессу блокировать две страницы листового уровня??? кластерный и некластерный индекс ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 12:49 |
|
DeadLock
|
|||
---|---|---|---|
#18+
msLex кластерный и некластерный индекс Ааа, Семён Семёныч (с) Брил. рука Спасибо!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 13:27 |
|
DeadLock
|
|||
---|---|---|---|
#18+
PaulWist, только партиция одинаковая. что показывает: Код: sql 1.
add: да и в принципе можно заголовок страниц : Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 13:34 |
|
DeadLock
|
|||
---|---|---|---|
#18+
felix_ff PaulWist, только партиция одинаковая. что показывает: Код: sql 1.
object_name object_id index_idpartition_numberART_PARAMS 1868689855 1 1 ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:46 |
|
DeadLock
|
|||
---|---|---|---|
#18+
PaulWist, предположу что у вас страница 66942916 m_type=2 страница 66942918 m_type = 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 15:03 |
|
DeadLock
|
|||
---|---|---|---|
#18+
felix_ff PaulWist, предположу что у вас страница 66942916 m_type=2 страница 66942918 m_type = 1 Я тоже сначала так предположил, НО m_type = 1 для обоих страниц. Картинка не пристёгивается :( ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 15:19 |
|
DeadLock
|
|||
---|---|---|---|
#18+
PaulWist Код: sql 1.
Похоже, что в этой транзакции есть ранее еще такой же апдейт с ART_ID, большим 1171866 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 16:27 |
|
|
start [/forum/topic.php?fid=46&fpage=9&tid=1684076]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
8ms |
get forum data: |
1ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 247ms |
total: | 360ms |
0 / 0 |