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

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

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

Можно ли в процедуре, делающей инсерт изменить ISOLATION LEVEL? это поможет?
...
Рейтинг: 0 / 0
Select во время Insert
    #40056171
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фикс дедлоков обычно начинается с анализа графа дедлока.
...
Рейтинг: 0 / 0
Select во время Insert
    #40056173
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

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

обычно причина в "неверном" порядке обращений к таблице


и что это ?
...
Рейтинг: 0 / 0
Select во время Insert
    #40056180
ol_chig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин

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

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

обычно причина в "неверном" порядке обращений к таблице


С этого места подробнее - я записываю!
...
Рейтинг: 0 / 0
Select во время Insert
    #40056188
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ol_chig
Ролг Хупин

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

а в запросе with (nolock) недопустим?


можно посмотреть, но это же плохая практика

Хорошо бы сделать так, что бы селект дождался завершения инсерта
...
Рейтинг: 0 / 0
Select во время Insert
    #40056191
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
С этого места подробнее - я записываю!


Разные индексы. Как следствие, разный порядок обхода записей.
...
Рейтинг: 0 / 0
Select во время Insert
    #40056193
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
aleks222
С этого места подробнее - я записываю!


Разные индексы. Как следствие, разный порядок обхода записей.


Гм? Вы индексы от таблицы, а тем паче от "обращения к таблице" отличаете?

ЗЫ. Я в курсе причин возникновения дедлоков.
...
Рейтинг: 0 / 0
Select во время Insert
    #40056195
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
ol_chig
пропущено...

а в запросе with (nolock) недопустим?


можно посмотреть, но это же плохая практика

Хорошо бы сделать так, что бы селект дождался завершения инсерта


Ну нарисуйте для начала with(readpast) в селекте.
Не поможет - нарисуйте with(tablockx) в селекте. Это радикальное средство.
...
Рейтинг: 0 / 0
Select во время Insert
    #40056200
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Гм? Вы индексы от таблицы, а тем паче от "обращения к таблице" отличаете?


Я то да, а вы?

На те вам два варианта трактовки термина "таблица", и в обоих случаях индексы приводят к разному порядку доступа к данным в ней.

1. Нормальный
Таблица включает в себя индексы, а значит обращение к любому из них есть обращение к таблице.


2. Притянутый за уши
Таблица - это куча, без кластерного индекса

Наличие на такой таблицы некластерных индексов не запрещено. При использовании этих индексов с последующим RID Lookup-ом, идет обращение к этой таблице (кучи в данном случае).
...
Рейтинг: 0 / 0
Select во время Insert
    #40056209
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Хорошо бы сделать так, что бы селект дождался завершения инсерта
Для начала граф дедлока покажите, в формате xml.
Если желания разбираться нет - допишите к таблице в select хинт with (tablock), тогда получите желаемое ожидание.
...
Рейтинг: 0 / 0
Select во время Insert
    #40056212
Fox Malder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,
Приведите примеры кода (процедура с инсертом, селект), где видно как вы запускает insrt в транзакции, и, если есть, объявленные уровни изоляции.
...
Рейтинг: 0 / 0
Select во время Insert
    #40056243
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала надо получить граф взаимоблокировки и изучить его.
...
Рейтинг: 0 / 0
Select во время Insert
    #40056618
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fox Malder
Ролг Хупин,
Приведите примеры кода (процедура с инсертом, селект), где видно как вы запускает insrt в транзакции, и, если есть, объявленные уровни изоляции.


1. Уровень изоляции в процедуре не объявляется, используется по умолчанию
Прицедура по сути никакая: используется чисто для инсерта

2. Селект тоже никакой - сделано вью, по сути обертка над 3 таблицами, из них идет выборка.
Одна из них та, в которую делается инсерт в п.1.
Добавил в определение вью на эту таблицу nolock - прошло. Но это же неправильно.

Да и формально, в этом случае возможны грязные чтения?
...
Рейтинг: 0 / 0
Select во время Insert
    #40056623
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Не важно, какие у вас там процедуры или не процедуры. Важно какие и в какой последовательности транзакции накладывают блокировки.

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

Не важно, какие у вас там процедуры или не процедуры. Важно какие и в какой последовательности транзакции накладывают блокировки.

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


Понимаю, но сам мучаюсь по той же причине
Это живая база у кустомера, пытался ему рассказать как сделать граф - ноль на выходе.

Стал бы мутить, если бы не было проблемы? нет, не стал бы.
Хотел бы не мутить? да, хотел бы, если бы этой долбаной проблемы не было

Поставив nolock в селекте на ту таблицу, в которую делается инсерт - проблема "ушла", но я понимаю, что nolock в данном случае - примочка, и скорее вредная.
...
Рейтинг: 0 / 0
Select во время Insert
    #40057809
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вот ыловил такой дедлок:

два одинаковых приложения на разных хостах делают

update vt set vt.state=@p1 where vt.id=@p2
Естественно, один из запросов - жертва, обламывается.

Здесь @p2 разные, но таблица небольшая, дедлок.

vt - это view враппер над таблицей

Как решить проблему в этом случае?

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

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

автор2. что еще можно ?

1. set deadlock_priority high
2. Написать обработчик ошибок так, чтобы он после отката повторно передавал управление на начало процедуры до полного удовлетворения. У MS даже где-то был пример такого выполнения.
...
Рейтинг: 0 / 0
Select во время Insert
    #40057830
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Ролг Хупин,

индексы на таблице какие?
ну и план запроса, граф дедлока желательно.


да там, выяснилось, что

update t1
trigger on update
delete from t2
trigger on update, delete


Вот интересно: можно ли прикрутить sp_getapplock\sp_releaseapplock внутри триггера?
...
Рейтинг: 0 / 0
Select во время Insert
    #40057849
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

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

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


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

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

Код: 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)




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

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

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

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


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


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