powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Select во время Insert
11 сообщений из 36, страница 2 из 2
Select во время Insert
    #40058126
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
Ролг Хупин
Как избежать Deadlock ?

1. Приложение вызывает процедуру, которая делает инсерт в таблицу
2. Приложение делает запрос к этой таблице и вот на этом запросе - вешается на deadlock

как разрулить?

Можно ли в процедуре, делающей инсерт изменить ISOLATION LEVEL? это поможет?


переписать приложение


Это точно не проходит, иначе жизнь не была бы такой насыщенной и интересной событиями
Исправить что-то можно в приложении, в запросе
...
Рейтинг: 0 / 0
Select во время Insert
    #40058129
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
Ролг Хупин

update vt set vt.state=@p1 where vt.id=@p2


Индекс (кластерный?) по vt.id , и, наверное посмотреть:
Код: sql
1.
SELECT name , lock_escalation, lock_escalation_desc FROM sys.tables



1. Кластерный индекс - есть
2. для всех таблиц, 0, табле
...
Рейтинг: 0 / 0
Select во время Insert
    #40058144
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Владислав Колосов
Ролг Хупин,

можно, но надо понимать, что внутри триггера будет удержана транзакция. Так что не рекомендуется.


ясно, тогда такой вариант:

Скажем упираются друг в друга два приложения с такими запросами, причем в триггере

Код: sql
1.
2.
3.
4.
update t1
  trigger 
      delete from t2....
      update t2



А если я сделаю что-то типа
Код: sql
1.
2.
3.
4.
update t1 with(updlock)
  trigger 
      delete from t2....
      update t2 with(updlock)




такое поможет избежать дедлока?


вы опять не написали самого интересного, может у вас там сканы сплошные.
граф дедлока желательно приложить и план выполнения актуальный.

дедлоки обычно разруливаются пониманием причины их возникновения, ччаще всего это конфликт две сессии "читатель-писательVS читатель-писатель", могут быть ситуации конфликта "писательVSписатель" но они встераются обычно если сессии ищут данные по разным индексам. еще может быть конечно взаимоблокировка параллелизма но она уж очень специфичная и встречается относительно редко.

теоретизировать можно бесконечно, вы не даете данных для анализа
...
Рейтинг: 0 / 0
Select во время Insert
    #40058153
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
SIMPLicity_
пропущено...


Индекс (кластерный?) по vt.id , и, наверное посмотреть:
Код: sql
1.
SELECT name , lock_escalation, lock_escalation_desc FROM sys.tables



1. Кластерный индекс - есть
2. для всех таблиц, 0, табле


Если приложение запрашивает в том числе и "ту же самую запись" (которая insert|update|delete), то NOLOCK . Если проблема проявляется случайным образом, то подозреваю эскалацию блокировок вплоть до таблицы,- и соответствующую проблему.
PS Если не прав, поправьте меня.
PPS Нагрузка на сервак вырастет. Поэтому в Вашем случае, наверное, лучше nolock ...
...
Рейтинг: 0 / 0
Select во время Insert
    #40058166
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
Ролг Хупин
пропущено...


1. Кластерный индекс - есть
2. для всех таблиц, 0, табле


Если приложение запрашивает в том числе и "ту же самую запись" (которая insert|update|delete), то NOLOCK . Если проблема проявляется случайным образом, то подозреваю эскалацию блокировок вплоть до таблицы,- и соответствующую проблему.
PS Если не прав, поправьте меня.
PPS Нагрузка на сервак вырастет. Поэтому в Вашем случае, наверное, лучше nolock ...


Ясно, спасибо.

Дошел вот сюда, апдейт то проходит, но в этой конструкции
Код: sql
1.
2.
3.
4.
update t1
  trigger 
      delete from t2 where cnt>0
      update t2



с двух хостов два разных апдейта возбуждают триггер, но в нем такой (см. выше) делете из другой таблицы(с ПК), который
пытается удалиить подмножество. Вот они друг друга и дедлочат.
Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой?
...
Рейтинг: 0 / 0
Select во время Insert
    #40058176
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Вот они друг друга и дедлочат.
Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой?

Если враг не сдается - его уничтожают.

ЗЫ. Варианты
1. Простой with(tablockx) или sp_getapplock
2. Сложный - асинхронное удаление.
3. Очень сложный - нахера мне это удаление?
...
Рейтинг: 0 / 0
Select во время Insert
    #40058187
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Ролг Хупин
Вот они друг друга и дедлочат.
Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой?

Если враг не сдается - его уничтожают.

ЗЫ. Варианты
1. Простой with(tablockx) или sp_getapplock
2. Сложный - асинхронное удаление.
3. Очень сложный - нахера мне это удаление?


3. ок, да, я бы сейчас и не удалял, это издержки старого дизайна, сделаю так, но это надо делать аккуратно.
2. вариант, тоже надо подумать, брокер нужен.
1. в триггере на делете?
...
Рейтинг: 0 / 0
Select во время Insert
    #40058239
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Ролг Хупин
Вот они друг друга и дедлочат.
Что можно сделать с такими делетами, чтобы они не зажимали друг друга и ни один не был жертвой?

Если враг не сдается - его уничтожают.

ЗЫ. Варианты
1. Простой with(tablockx) или sp_getapplock
2. Сложный - асинхронное удаление.
3. Очень сложный - нахера мне это удаление?



Кстати, почему with(tablockx), а не with(tablock)?

with(tablockx) - локнет таблицу для остальных до конца текущей транзакции
with(tablock) - локнет таблицу для модификаторов до конца текущей транзакции, но читатели смогут читать
...
Рейтинг: 0 / 0
Select во время Insert
    #40058252
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
aleks222
пропущено...

Если враг не сдается - его уничтожают.

ЗЫ. Варианты
1. Простой with(tablockx) или sp_getapplock
2. Сложный - асинхронное удаление.
3. Очень сложный - нахера мне это удаление?



Кстати, почему with(tablockx), а не with(tablock)?

with(tablockx) - локнет таблицу для остальных до конца текущей транзакции
with(tablock) - локнет таблицу для модификаторов до конца текущей транзакции, но читатели смогут читать

Потому как with(tablock) не спасет.
Учиться тебе надо, барин...

3. Дерзай.
2. Кому нужен? Вовсе не нужен.
1. Есть еще варианты?
...
Рейтинг: 0 / 0
Select во время Insert
    #40058272
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Потому как with(tablock) не спасет.
И почему же?
...
Рейтинг: 0 / 0
Select во время Insert
    #40058274
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Ролг Хупин
пропущено...



Кстати, почему with(tablockx), а не with(tablock)?

with(tablockx) - локнет таблицу для остальных до конца текущей транзакции
with(tablock) - локнет таблицу для модификаторов до конца текущей транзакции, но читатели смогут читать

Потому как with(tablock) не спасет.
Учиться тебе надо, барин...

3. Дерзай.
2. Кому нужен? Вовсе не нужен.
1. Есть еще варианты?


Не, ну, Ильич был прав насчет учиться, но не до такой же степени

2. у меня есть мысль как сделать асинхронное удаление, но там брокер нужен. как же без брокера? например, на словах хотя бы
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Select во время Insert
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]