|
Select во время Insert
|
|||
---|---|---|---|
#18+
Как избежать Deadlock ? 1. Приложение вызывает процедуру, которая делает инсерт в таблицу 2. Приложение делает запрос к этой таблице и вот на этом запросе - вешается на deadlock как разрулить? Можно ли в процедуре, делающей инсерт изменить ISOLATION LEVEL? это поможет? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 11:43 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Фикс дедлоков обычно начинается с анализа графа дедлока. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 11:50 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин, обычно причина в "неверном" порядке обращений к таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 11:55 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Критик Ролг Хупин, обычно причина в "неверном" порядке обращений к таблице и что это ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:00 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин как разрулить? а в запросе with (nolock) недопустим? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:01 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Критик Ролг Хупин, обычно причина в "неверном" порядке обращений к таблице С этого места подробнее - я записываю! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:02 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
ol_chig Ролг Хупин как разрулить? а в запросе with (nolock) недопустим? можно посмотреть, но это же плохая практика Хорошо бы сделать так, что бы селект дождался завершения инсерта ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:10 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
aleks222 С этого места подробнее - я записываю! Разные индексы. Как следствие, разный порядок обхода записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:14 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
msLex aleks222 С этого места подробнее - я записываю! Разные индексы. Как следствие, разный порядок обхода записей. Гм? Вы индексы от таблицы, а тем паче от "обращения к таблице" отличаете? ЗЫ. Я в курсе причин возникновения дедлоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:19 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин ol_chig пропущено... а в запросе with (nolock) недопустим? можно посмотреть, но это же плохая практика Хорошо бы сделать так, что бы селект дождался завершения инсерта Ну нарисуйте для начала with(readpast) в селекте. Не поможет - нарисуйте with(tablockx) в селекте. Это радикальное средство. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:21 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
aleks222 Гм? Вы индексы от таблицы, а тем паче от "обращения к таблице" отличаете? Я то да, а вы? На те вам два варианта трактовки термина "таблица", и в обоих случаях индексы приводят к разному порядку доступа к данным в ней. 1. Нормальный Таблица включает в себя индексы, а значит обращение к любому из них есть обращение к таблице. 2. Притянутый за уши Таблица - это куча, без кластерного индекса Наличие на такой таблицы некластерных индексов не запрещено. При использовании этих индексов с последующим RID Lookup-ом, идет обращение к этой таблице (кучи в данном случае). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:25 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин Хорошо бы сделать так, что бы селект дождался завершения инсерта Если желания разбираться нет - допишите к таблице в select хинт with (tablock), тогда получите желаемое ожидание. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:40 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин, Приведите примеры кода (процедура с инсертом, селект), где видно как вы запускает insrt в транзакции, и, если есть, объявленные уровни изоляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 12:54 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Сначала надо получить граф взаимоблокировки и изучить его. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2021, 14:16 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Fox Malder Ролг Хупин, Приведите примеры кода (процедура с инсертом, селект), где видно как вы запускает insrt в транзакции, и, если есть, объявленные уровни изоляции. 1. Уровень изоляции в процедуре не объявляется, используется по умолчанию Прицедура по сути никакая: используется чисто для инсерта 2. Селект тоже никакой - сделано вью, по сути обертка над 3 таблицами, из них идет выборка. Одна из них та, в которую делается инсерт в п.1. Добавил в определение вью на эту таблицу nolock - прошло. Но это же неправильно. Да и формально, в этом случае возможны грязные чтения? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2021, 12:48 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин, Не важно, какие у вас там процедуры или не процедуры. Важно какие и в какой последовательности транзакции накладывают блокировки. Вы граф делока покажете, или так и дальше будете всех мучать невнятными описаниями той фотографии, по которой предлагается лечить вашу проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2021, 13:02 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Гавриленко Сергей Алексеевич Ролг Хупин, Не важно, какие у вас там процедуры или не процедуры. Важно какие и в какой последовательности транзакции накладывают блокировки. Вы граф делока покажете, или так и дальше будете всех мучать невнятными описаниями той фотографии, по которой предлагается лечить вашу проблему? Понимаю, но сам мучаюсь по той же причине Это живая база у кустомера, пытался ему рассказать как сделать граф - ноль на выходе. Стал бы мутить, если бы не было проблемы? нет, не стал бы. Хотел бы не мутить? да, хотел бы, если бы этой долбаной проблемы не было Поставив nolock в селекте на ту таблицу, в которую делается инсерт - проблема "ушла", но я понимаю, что nolock в данном случае - примочка, и скорее вредная. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2021, 13:31 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Еще вот ыловил такой дедлок: два одинаковых приложения на разных хостах делают update vt set vt.state=@p1 where vt.id=@p2 Естественно, один из запросов - жертва, обламывается. Здесь @p2 разные, но таблица небольшая, дедлок. vt - это view враппер над таблицей Как решить проблему в этом случае? 1. заменить в исходном тексте приложения запрос на вызов процедуры, дальше было бы проще, типа прикрутить sp_applock 2. что еще можно ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 14:53 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин, индексы на таблице какие? ну и план запроса, граф дедлока желательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:06 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин, автор2. что еще можно ? 1. set deadlock_priority high 2. Написать обработчик ошибок так, чтобы он после отката повторно передавал управление на начало процедуры до полного удовлетворения. У MS даже где-то был пример такого выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:23 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
felix_ff Ролг Хупин, индексы на таблице какие? ну и план запроса, граф дедлока желательно. да там, выяснилось, что update t1 trigger on update delete from t2 trigger on update, delete Вот интересно: можно ли прикрутить sp_getapplock\sp_releaseapplock внутри триггера? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:33 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин, можно, но надо понимать, что внутри триггера будет удержана транзакция. Так что не рекомендуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 15:51 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Владислав Колосов Ролг Хупин, можно, но надо понимать, что внутри триггера будет удержана транзакция. Так что не рекомендуется. ясно, тогда такой вариант: Скажем упираются друг в друга два приложения с такими запросами, причем в триггере Код: sql 1. 2. 3. 4.
А если я сделаю что-то типа Код: sql 1. 2. 3. 4.
такое поможет избежать дедлока? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 16:07 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин Как избежать Deadlock ? 1. Приложение вызывает процедуру, которая делает инсерт в таблицу 2. Приложение делает запрос к этой таблице и вот на этом запросе - вешается на deadlock как разрулить? Можно ли в процедуре, делающей инсерт изменить ISOLATION LEVEL? это поможет? переписать приложение ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 17:50 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин update vt set vt.state=@p1 where vt.id=@p2 Индекс (кластерный?) по vt.id , и, наверное посмотреть: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2021, 18:01 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
SIMPLicity_ Ролг Хупин Как избежать Deadlock ? 1. Приложение вызывает процедуру, которая делает инсерт в таблицу 2. Приложение делает запрос к этой таблице и вот на этом запросе - вешается на deadlock как разрулить? Можно ли в процедуре, делающей инсерт изменить ISOLATION LEVEL? это поможет? переписать приложение Это точно не проходит, иначе жизнь не была бы такой насыщенной и интересной событиями Исправить что-то можно в приложении, в запросе ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 10:50 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
SIMPLicity_ Ролг Хупин update vt set vt.state=@p1 where vt.id=@p2 Индекс (кластерный?) по vt.id , и, наверное посмотреть: Код: sql 1.
1. Кластерный индекс - есть 2. для всех таблиц, 0, табле ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 11:00 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин Владислав Колосов Ролг Хупин, можно, но надо понимать, что внутри триггера будет удержана транзакция. Так что не рекомендуется. ясно, тогда такой вариант: Скажем упираются друг в друга два приложения с такими запросами, причем в триггере Код: sql 1. 2. 3. 4.
А если я сделаю что-то типа Код: sql 1. 2. 3. 4.
такое поможет избежать дедлока? вы опять не написали самого интересного, может у вас там сканы сплошные. граф дедлока желательно приложить и план выполнения актуальный. дедлоки обычно разруливаются пониманием причины их возникновения, ччаще всего это конфликт две сессии "читатель-писательVS читатель-писатель", могут быть ситуации конфликта "писательVSписатель" но они встераются обычно если сессии ищут данные по разным индексам. еще может быть конечно взаимоблокировка параллелизма но она уж очень специфичная и встречается относительно редко. теоретизировать можно бесконечно, вы не даете данных для анализа ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 11:48 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин SIMPLicity_ пропущено... Индекс (кластерный?) по vt.id , и, наверное посмотреть: Код: sql 1.
1. Кластерный индекс - есть 2. для всех таблиц, 0, табле Если приложение запрашивает в том числе и "ту же самую запись" (которая insert|update|delete), то NOLOCK . Если проблема проявляется случайным образом, то подозреваю эскалацию блокировок вплоть до таблицы,- и соответствующую проблему. PS Если не прав, поправьте меня. PPS Нагрузка на сервак вырастет. Поэтому в Вашем случае, наверное, лучше nolock ... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:12 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
SIMPLicity_ Ролг Хупин пропущено... 1. Кластерный индекс - есть 2. для всех таблиц, 0, табле Если приложение запрашивает в том числе и "ту же самую запись" (которая insert|update|delete), то NOLOCK . Если проблема проявляется случайным образом, то подозреваю эскалацию блокировок вплоть до таблицы,- и соответствующую проблему. PS Если не прав, поправьте меня. PPS Нагрузка на сервак вырастет. Поэтому в Вашем случае, наверное, лучше nolock ... Ясно, спасибо. Дошел вот сюда, апдейт то проходит, но в этой конструкции Код: sql 1. 2. 3. 4.
с двух хостов два разных апдейта возбуждают триггер, но в нем такой (см. выше) делете из другой таблицы(с ПК), который пытается удалиить подмножество. Вот они друг друга и дедлочат. Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:33 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин Вот они друг друга и дедлочат. Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой? Если враг не сдается - его уничтожают. ЗЫ. Варианты 1. Простой with(tablockx) или sp_getapplock 2. Сложный - асинхронное удаление. 3. Очень сложный - нахера мне это удаление? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 12:56 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
aleks222 Ролг Хупин Вот они друг друга и дедлочат. Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой? Если враг не сдается - его уничтожают. ЗЫ. Варианты 1. Простой with(tablockx) или sp_getapplock 2. Сложный - асинхронное удаление. 3. Очень сложный - нахера мне это удаление? 3. ок, да, я бы сейчас и не удалял, это издержки старого дизайна, сделаю так, но это надо делать аккуратно. 2. вариант, тоже надо подумать, брокер нужен. 1. в триггере на делете? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 13:21 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
aleks222 Ролг Хупин Вот они друг друга и дедлочат. Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой? Если враг не сдается - его уничтожают. ЗЫ. Варианты 1. Простой with(tablockx) или sp_getapplock 2. Сложный - асинхронное удаление. 3. Очень сложный - нахера мне это удаление? Кстати, почему with(tablockx), а не with(tablock)? with(tablockx) - локнет таблицу для остальных до конца текущей транзакции with(tablock) - локнет таблицу для модификаторов до конца текущей транзакции, но читатели смогут читать ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 14:48 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
Ролг Хупин aleks222 пропущено... Если враг не сдается - его уничтожают. ЗЫ. Варианты 1. Простой with(tablockx) или sp_getapplock 2. Сложный - асинхронное удаление. 3. Очень сложный - нахера мне это удаление? Кстати, почему with(tablockx), а не with(tablock)? with(tablockx) - локнет таблицу для остальных до конца текущей транзакции with(tablock) - локнет таблицу для модификаторов до конца текущей транзакции, но читатели смогут читать Потому как with(tablock) не спасет. Учиться тебе надо, барин... 3. Дерзай. 2. Кому нужен? Вовсе не нужен. 1. Есть еще варианты? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 15:10 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
aleks222 Потому как with(tablock) не спасет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 15:38 |
|
Select во время Insert
|
|||
---|---|---|---|
#18+
aleks222 Ролг Хупин пропущено... Кстати, почему with(tablockx), а не with(tablock)? with(tablockx) - локнет таблицу для остальных до конца текущей транзакции with(tablock) - локнет таблицу для модификаторов до конца текущей транзакции, но читатели смогут читать Потому как with(tablock) не спасет. Учиться тебе надо, барин... 3. Дерзай. 2. Кому нужен? Вовсе не нужен. 1. Есть еще варианты? Не, ну, Ильич был прав насчет учиться, но не до такой же степени 2. у меня есть мысль как сделать асинхронное удаление, но там брокер нужен. как же без брокера? например, на словах хотя бы ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2021, 15:39 |
|
|
start [/forum/topic.php?all=1&fid=46&tid=1684885]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 142ms |
0 / 0 |