|
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?fid=46&gotonew=1&tid=1684885]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
70ms |
get topic data: |
11ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 200ms |
0 / 0 |