powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MSS и дедлок при запуске stored procedure...
25 сообщений из 50, страница 2 из 2
MSS и дедлок при запуске stored procedure...
    #32448508
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
output параметры влияют только на мое понимание кода :)


P.S> Ответьте хоть - заработал мой первый вариант или нет? Или на чем вы остановились? Надеюсь не на nolock?:)

PPS> read commited я написал просто я ясности (так как в первом варианте был repeatable read)

PPPS> Если при соединении с сервером уровень изоляции выставляется в SERIALIZABLE - значит таковы настройки соединения - их, конечно же, можно изменить...
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32448541
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
COM или COM+ используется? Если COM+ то да, там выставляется Serialazable. Для COM-компонентов, про которые тут было написано - это надо смотреть компоненты, что они делают.
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32448870
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, на несколько дней в отпуск ушел :)
COM объект не сидит в COM+. А сам я не открываю транзакцию, поскольку транзакция в процедуре.
Через пару дней проверю!
Спасибо!
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32448946
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот на самом интересном месте,
а на время отпуска твой хинт тебя и подведет, тьфу.., тьфу конечно.
А клиент должен быть ни при чем, все делать надо в ХП, как советуют тут многоуважемые funikovyuri и Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32449743
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно облом. :)
Глядишь ветку вообще на ГФ перекинут и нам ничего не достанется, т.к. то что мы тут мучимся, для Глори - полпинка. :)

Я вообще не понимаю откуда у него локи на одной транзакции. Порядок операторов тот же. И Если стоит Read Commited то никаких локов и близко быть не должно... Значит все таки уровень изоляции другой.
Или он не все говорит :), может кто другой лочит?

Первый селект по идее не должен выставлять wide lock на всю таблицу, макцимум row lock, можно для проверки и хинт поставить.

А вообще не мешало бы и на планы взглянуть :).

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32449871
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23

Еще как может ->
Например
первый поток выполнил 1й select - зделал на выборке shared lock
2й поток выполнил 1й select - зделал тоже самое
первый поток пытается выполнить update но на нем уже есть shared lock от второго потока - так что X получить не удаеться - т.е. он начинает ждать 2й поток
второй поток пытаеться сделать update - и тоже ждет - но теперь уже 1й поток

ТОГО: deadlock :(

P.S> Эта процедура в том виде в котором ее нам показали - прямой кандидат в readtable read - так как он при первом же select'е воспользуется X блокировкой - вот так...
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32449921
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм. Да. Если у обоих шаред, то но один не сможет конверануть. Но в таком варианте как у него , транзакция быстрая и дедлоки должны быть событием редким. Апдейтится то только отдельные строки.

В таком случае на первом селекте ставим UPDLOCK.
А? :)
или RID

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32449928
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Off:
>А вообще не мешало бы и на планы взглянуть :).
А с этого обычно он (глори) и начинает.
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32450817
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23

В таком случае на первом селекте ставим UPDLOCK

Можно - но я на хинты смотрю как на workaround - когда необходимое либо не возможно стандартными средствами, либо нужна косметическая доводка кода - а так я за все стандартное - в данном случае за repeatable read - который сделает тоже самое, но imho - красивше...
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32450840
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так - каюсь.... нужно использовать либо UPDLOCK, либо менять логику работы процедуры...


PS> мда...
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32450862
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще еще интересно расмотреть вариант с автоматической транзакцией (COM+), а из процедуры все хинты и явное объявление транзакций повыкидывать.
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32451465
Фотография Alexes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем нужен подзапрос в Update?
Почему бы не записывать значения столбцов в переменные прямо в Update?
Возможно всё-таки удастся обойтись без транзакций.
Следующее написано на основе первого варианта процедуры:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
update ap_formula
set
  ap_last_date = getdate(),
  @ap_last_date = ap_last_date,  --записываем в переменную старое значение
 
  @lastvalue = ap_last_value = convert(int,ISNULL(ap_last_value, 0 )) + @calculationinterval,  --записываем в столбец и переменную новое значение
 
  @period_type = period_type,
  @formulatext = ap_template 
where ap_formula_id = @formula_id 
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32452679
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, народ!

Вариант процедуры с READ COMMITTED - работает, собака! :)
По-моему самое лучшее решение!
Значит по умолчанию транзакция открывается в режиме Serialize!

Спасибо всем за помощь!!!!!

До связи!
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32453058
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угу - только не всегда правильно - ну да это не важно...
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32453654
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! Обьявился :).
Значит таки Serializable.
Зашибись :), будет рид коммитед.

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32453739
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет еще разок!
Все равно, мне кажется, что есть какaя-то проблем с новым .NET провайдером(SqlClient).
Делаю параллельные тесты
Суть теста воспроизвести значительную нагрузку на аппликацию.
Стер все триггеры с таблиц.
1. БЕЗ всякой транзакции запускаю select, связывающий несколько таблиц по LEFT OUTER JOIN(не знаю, важно ли это). Ключ для последующих update выбираю рандомально из select-a. Select приносит каждый раз один и тот же результат.
2. В одной транзакции делаю updates на пару таблиц из вышеприведенного select-a. Транзакцию открываю ReadCommited - глючит с тем же "...victim deadlock... bla bla...".
Причем локируется select.
И это на симуляции 5-ти одновременных юзеров!
Может у кого есть идеи?
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32453785
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут надо смотреть почему ключ возвращет тот же, потому и локи.
Начнем сначала. :)
1.Тексты в студию.
2.Результаты тоже.
3.Планы! Планы!
:)

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32453990
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То что селект приносит одни и те же данные - это я так хочу :). Из этих данных выбираю рандомальную строчку, а из нее беру значение ключа и с этим ключем иду апдэйт делать.
А как я планы покажу? Тут же приэттачить картинку нельзя....
Завтра пришлю queries на суд :)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32455187
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET SHOWPLAN_TEXT ON
и потом этот план в сорс теге на ковер.

Блин, чуйствую дойдем мы таки до UPDLOCK, кстати ничего крамольного в этом не вижу :)

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32459755
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, народ!
Вот он, план! . Что-то есть нездоровое? :)

Запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT order_line.cust_company_id cust_company_id, order_line.line_no line_no, order_line.order_id order_id, 
order_line.request_id request_id, order_line.ldmnd_stat_id ldmnd_stat_id, order_line.open_date open_date, 
order_line.creation_datetime creation_datetime, order_line.priority priority, service_call.sa_person_id 
sa_person_id, order_stat.descr order_stat_descr, order_line.descr descr, 
address.address_id address_id, order_line.order_stat_uniq_id order_stat_uniq_id, order_stat.order_type_id 
order_stat_order_type_id  FROM order_line  LEFT OUTER JOIN service_call 
ON order_line.order_id=service_call.order_id LEFT OUTER JOIN order_stat ON 
(order_stat.order_type_id = 'const_param') AND  
order_line.order_stat_uniq_id=order_stat.order_stat_uniq_id AND 
order_line.order_type_id=order_stat.order_type_id LEFT OUTER JOIN address 
ON order_line.ship_to_address_id=address.address_id WHERE 
( order_line.node_id in ('') or  1 = 1  or order_line.node_id IS NULL) 
and (( 1  =  1 )) AND (order_line.order_type_id = 'const_param') AND 
(order_line.order_stat_uniq_id >=  100 ) AND (order_line.order_stat_uniq_id <  700 ) AND (( 1  =  1 ))


План:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
| --Hash Match(Right Outer Join, HASH:([address].[address_id])=([order_line].[ship_to_address_id]), 
 
RESIDUAL:([order_line].[ship_to_address_id]=[address].[address_id]))

| --Index Scan(OBJECT:([MyDB].[dbo].[address].[i_address_3]))
 

| --Hash Match(Right Outer Join, HASH:([order_stat].[order_stat_uniq_id])=([order_line].[order_stat_uniq_id]),
 
 RESIDUAL:([order_line].[order_type_id]='const_param'))

| --Clustered Index Seek(OBJECT:([MyDB].[dbo].[order_stat].[i_order_stat_1]), 
 
SEEK:([order_stat].[order_type_id]='const_param') ORDERED FORWARD)

| --Merge Join(Left Outer Join, MERGE:([order_line].[order_id])=([service_call].[order_id]), 
 
RESIDUAL:([order_line].[order_id]=[service_call].[order_id]))

| --Clustered Index Scan(OBJECT:([MyDB].[dbo].[order_line].[i_order_line_1]),  
 
WHERE:(([order_line].[order_stat_uniq_id]>= 100  AND [order_line].[order_stat_uniq_id]< 700 ) AND [order_line].[order_type_id]='const_param') 
ORDERED FORWARD)

|--Clustered Index Scan(OBJECT:([MyDB].[dbo].[service_call].[i_service_call_1]), ORDERED FORWARD)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32459896
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погоди. В начале то вроде другой запрос был. А теперь уже этот?
Ну да ладно.
Гляжу я на него и с многим не согласен.
Вот эта часть
Код: plaintext
1.
2.
3.
LEFT OUTER JOIN order_stat ON 
(order_stat.order_type_id = 'const_param') AND  
order_line.order_stat_uniq_id=order_stat.order_stat_uniq_id AND 
order_line.order_type_id=order_stat.order_type_id

левый джойн и констатнта. А смысл? Ничего ведь не изменится. Вообще, там у тебя одни Left Join'ы , они там действительно нужны?


Далее, вот это
Код: plaintext
1.
2.
( order_line.node_id in ('') or  1 = 1  or order_line.node_id IS NULL) 
and (( 1  =  1 )) AND (order_line.order_type_id = 'const_param') AND 
(order_line.order_stat_uniq_id >=  100 ) AND (order_line.order_stat_uniq_id <  700 ) AND (( 1  =  1 ))

чесно говоря, вообще ниче не понял.

order_line.node_id in ('') or 1=1 - для меня бесмысленно. Если уж нужно проверить на пустую строку то
order_line.node_id=''
1=1 - лишние телодвижения.

По плану. Индексы давно проверял? У тебя кластерный индекс сканируется, чего быть не должно. Сделай апдейт индексов или дропани и создай заново.
Код: plaintext
order_line.order_stat_uniq_id >=  100 ) AND (order_line.order_stat_uniq_id <  700 ) AND (( 1  =  1 ))

1=1 убрать а остальное вынести наверх в джойн.

Там тоже должень быть Merge.
Пошустрее должно быть.

Кстати, обьясни все таки, каким боком участвует данный запрос в обсуждаемой ранее проблеме ? :)



Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32460094
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Что-то есть нездоровое? :)
Есть

предлагаю в начале вынести этот запрос, в месте с планами на форум MS SQL, а потом сюда.
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32460498
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, народ!
1. Маг, это уже несколько другая проблема. Я писал пару дней назад:
----------------------------
"И снова deadlock....но в другой ситуации." :
Все равно, мне кажется, что есть какaя-то проблем с новым .NET провайдером(SqlClient).
Делаю параллельные тесты
Суть теста воспроизвести значительную нагрузку на аппликацию.
Стер все триггеры с таблиц.
1. БЕЗ всякой транзакции запускаю select, связывающий несколько таблиц по LEFT OUTER JOIN(не знаю, важно ли это). Ключ для последующих update выбираю рандомально из select-a. Select приносит каждый раз один и тот же результат.
2. В одной транзакции делаю updates на пару таблиц из вышеприведенного select-a. Транзакцию открываю ReadCommited - глючит с тем же "...victim deadlock... bla bla...".
Причем локируется select.
И это на симуляции 5-ти одновременных юзеров!
Может у кого есть идеи?
----------------------------

2. По поводу непонятных параметров: этот запрос из аппликации строится динамически. В данном случае нет никаких дополнительных параметров и поэтому видим непонятные (in ' ') или 1=1, избавиться от которых на данном этапе не могу :(.
Спасибо за советы по быстродействию и оптимизации. Попробую. Но, мне кажется это не связано с lock...
3. SA - укажи, пожалуйста, на нездоровое :)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32460899
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык я на темы кроме первого пста почти никогда не смотрю, вот и до их пор думал что воз и ныне там :)
ОК.
На счет непонятностей, лучше уж устроить так чтобы при отсутствии внятных условий вообще ничего не писать. Как видно из плана, те самые "лишние телодвижения" в любом случае не учитываются но парсятся. А это время.
ну да ладно, это мелочи.

Индексы все таки ни к черту. Если при поиске на range of values в кластерном индексе, где все должно летать, делается scan, лто это и есть нездорово.

Почему локи? Честно говоря, непонятно. 2 селекта, оба делают shared, ну и далее?
На ком локи? Больше никто не участвует?

А вообще у тебя действительно 2 варианта:
1.Продолжать колупаться с нами.
Вероятнее всего решим, но когда? :)
2. Таки вымнести на иквельный форум.
Там Glory, pkarklin,АГ и иже с ними расколупают с пол-пинка и нам ничего не достанется ;( :)
Но если тебе важнее скорость, то однозначно - туда.



Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32461350
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И только один человек заметил что в апдейте глупость написана.
Из-за нее и блокировка идет, т.к. Сначала делается селект записи, а потом ее же пытаются изменить

Код: plaintext
1.
2.
3.
update ap_formula set ap_last_date = getdate(), ap_last_value = 
(select convert(int,ISNULL(ap_last_value, 0 )) + @calculationinterval 
from ap_formula where ap_formula_id = @formula_id) where ap_formula_id = @formula_id 


писать нужно так:
Код: plaintext
1.
2.
3.
update ap_formula 
  set ap_last_date = getdate(), 
  ap_last_value = convert(int,ISNULL(ap_last_value, 0 )) + @calculationinterval 
  where ap_formula_id = @formula_id 
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MSS и дедлок при запуске stored procedure...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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