Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Select во время Insert / 25 сообщений из 36, страница 1 из 2
23.03.2021, 11:43
    #40056166
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select во время Insert
Как избежать Deadlock ?

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

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

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

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

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


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

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

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

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


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

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

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


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

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


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


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


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

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

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


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

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


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


Я то да, а вы?

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

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


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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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


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

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

Код: 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
29.03.2021, 17:50
    #40057917
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select во время Insert
Ролг Хупин
Как избежать Deadlock ?

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

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

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


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

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


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