Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
Есть таблицы А и В. В одной сессии выполняем Код: sql 1. У таблицы А есть триггер, где модифицируется таблица В: Код: sql 1. 2. таким образом, сперва накладывается X-блокировка на таблицу А, а затем IX на таблицу В. Пока понятно. В другой сессии выполяется запрос Код: sql 1. 2. так вот, оказывается, что этот запрос накладывает свои S-блокировки сперва на В, а затем пытается на А. И получается классический deadlock - доступ к двум ресурсам в разном порядке. Самое простое, что советуют в этом случае - сделать порядок доступа одинаковым. Но как это сделать для SELECT с JOIN ? Есть ли какие-то хинты, которые бы задавали очередность наложения блокировок? MS SQL 2014. Обе транзакции READ COMMITTED. PS. Про READ_COMMITTED_SNAPSHOT знаю, но он выключен, включать его не в моей компетенции. Хотелось бы попробовать обойтись управлением блокировками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 15:47 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, слова вроде из той песни, но смысл... а как вы достигли такого понимания вопроса? по вашему прядок shared lock в одном запросе О_о имеет значение, а не то что же они блокируют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 15:53 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherЕсть ли какие-то хинты, которые бы задавали очередность наложения блокировок? PS. Про READ_COMMITTED_SNAPSHOT знаю, но он выключен, включать его не в моей компетенции. Хотелось бы попробовать обойтись управлением блокировками. посмотрите сюда : FORCE ORDER hint ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 16:01 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
komradCane Cat FisherЕсть ли какие-то хинты, которые бы задавали очередность наложения блокировок? PS. Про READ_COMMITTED_SNAPSHOT знаю, но он выключен, включать его не в моей компетенции. Хотелось бы попробовать обойтись управлением блокировками. посмотрите сюда : FORCE ORDER hint действительно, именно "очередность наложения блокировок", пусть и запрос заодно перепишет тогда. Но как друзья вы не садитесь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 16:03 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
TaPaKа как вы достигли такого понимания вопроса? Код: xml 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 16:48 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherЕсть таблицы А и В. В одной сессии выполняем Код: sql 1. У таблицы А есть триггер, где модифицируется таблица В: Код: sql 1. 2. таким образом, сперва накладывается X-блокировка на таблицу А, а затем IX на таблицу В. Пока понятно. В другой сессии выполяется запрос Код: sql 1. 2. так вот, оказывается, что этот запрос накладывает свои S-блокировки сперва на В, а затем пытается на А. И получается классический deadlock - доступ к двум ресурсам в разном порядке. Самое простое, что советуют в этом случае - сделать порядок доступа одинаковым. Но как это сделать для SELECT с JOIN ? Есть ли какие-то хинты, которые бы задавали очередность наложения блокировок? MS SQL 2014. Обе транзакции READ COMMITTED. PS. Про READ_COMMITTED_SNAPSHOT знаю, но он выключен, включать его не в моей компетенции. Хотелось бы попробовать обойтись управлением блокировками. Блокировки накладываются в том же порядке, в котором движок обращается к данным Если ваш select.. from B join A сначала читает строку из B а потом из A то в том же порядке накладываются блокировки возможность поменять порядок наложения блокировок сильно зависит от плана запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 16:59 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat FisherСамое простое, что советуют в этом случае - сделать порядок доступа одинаковым. Но как это сделать для SELECT с JOIN ?Может стоит выбирать оптимальный путь, а не простой? Cane Cat FisherЕсть ли какие-то хинты, которые бы задавали очередность наложения блокировок?Непосредственных, естественно, нет. Опосредованно влияющие есть (см. далее). Если таки пойдете "простым" путем, то будьте готовы к возможной деградации производительности вашего select. Опция force order повлияет на соединения всех таблиц в запросе. Если хотите манипуляции с очередностью блокировок ограничить только конкретным соединением, то это можно осуществить, например, так: Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 16:59 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, ну 2 апдейта и селект. Как не пляшите INSERT SELECT ничего не поменяет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2018, 17:02 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
invm Код: sql 1. 2. Спасибо, так и сделал. Помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 16:55 |
|
||
|
Очередность блокировок в JOIN
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisherinvm Код: sql 1. 2. Спасибо, так и сделал. Помогло. теперь insert блокирует всб таблицу и дедлока действительно нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2018, 16:58 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=142&tid=1689425]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 344ms |

| 0 / 0 |
