powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MSS и дедлок при запуске stored procedure...
50 сообщений из 50, показаны все 2 страниц
MSS и дедлок при запуске stored procedure...
    #32443389
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем!
Есть проблема.
Процедура на MSS работает в транзакции. Когда запускаю эту же самую процедуру из VC-6 стандартно через АDO в стресс режиме(одновременное обращение более чем одного клиента, то все работает. Если запускаю эту же процедуру из C# .NET в "многоюзерном режиме", то получаю регулярно
"Transaction (Process ID <номер>) was deadlocked on {lock} resources with another process and has been chosen as the deadlock victim. Rerun the transaction." .
В процедуре нет кода, который мог бы вызвать deadlock, кроме этого из сишного кода она работает!
Привожу кусок кода, вызывающего процедуру.
Может кто сталкивался с подобной проблемой?
Может какие-то ресурсы не освобождаю?
Заранее спасибо.
//////////////
IDbCommand command = null;
IDbConnection connection = null;

try
{
//здесь создается объекты в зависимост от базы(Oracle или MSS) имплементирующие один и тот же стандартный интерфейс
InitDBObjects(strProcName, new Hashtable(), ref connection, ref command);

command.CommandType = CommandType.StoredProcedure ;

IDbDataParameter dataParameter = null;

foreach(MyParam dbParam in Params)//from client
{
dataParameter = command.CreateParameter();
dataParameter.ParameterName = m_paramPrefixStoredProc dataParameter.Direction = dbParam.Direction;
object objValue = dbParam.Value;
dataParameter.Size = dbParam.Size;
dataParameter.Value = objValue;
command.Parameters.Add(dataParameter);
}

command.ExecuteNonQuery();

Results.Clear();

foreach(IDbDataParameter param in command.Parameters )
{
if(param.Direction == ParameterDirection.Output ||
param.Direction == ParameterDirection.InputOutput ||
param.Direction == ParameterDirection.ReturnValue)
Results.Add(param.ParameterName.Replace(m_paramPrefix, ""), param.Value);
}
}
catch(Exception e)
{
throw new MyException(e);
}
finally
{
//close connection
CleanupConnection(ref connection);
}
//////////////
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32444370
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедлоки - это проблема хранимки и сервера а не клиента, приведи процедурку.
А лучше запусти трассу и посмотри кто кого лочит.

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32444381
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, один из вариантов - ловить номер ошибки(если не ошибаюсь 1251) и перезапускать транзакцию.

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32444410
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для информации: триггеров нет на эту таблицу
после того, как добавил WITH (NOLOCK) - локинг ушел.
Где может быть дедлок? Все просто, по-моему....
Спасибо

CREATE PROCEDURE sp_formula
@formula_id varchar(30),
@calculationinterval int,
@lastvalue integer output,
@formulatext varchar(50) output

as
declare @period_type char (1)
declare @ap_last_value varchar(50)
declare @ap_last_date datetime
declare @ap_template varchar(50)
BEGIN TRANSACTION

select @period_type = period_type, @ap_last_date = ap_last_date, @formulatext = ap_template from ap_formula WITH (NOLOCK) where ap_formula_id = @formula_id


BEGIN

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

select @lastvalue = convert(int,ap_last_value)
from ap_formula where ap_formula_id = @formula_id

END
COMMIT TRANSACTION
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32444497
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В трансакции не должно быть ничего лишнего, держи ее максимально короткой.
Итак:

Код: 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.
25.
26.
27.
CREATE PROCEDURE sp_formula 
@formula_id varchar( 30 ), 
@calculationinterval int, 
@lastvalue integer output, 
@formulatext varchar( 50 ) output 

as 
declare @period_type char ( 1 ) 
declare @ap_last_value varchar( 50 ) 
declare @ap_last_date datetime 
declare @ap_template varchar( 50 ) 

BEGIN 
select @period_type = period_type, @ap_last_date = ap_last_date, @formulatext = ap_template from ap_formula where ap_formula_id = @formula_id 


BEGIN TRANSACTION 

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 

COMMIT TRANSACTION

select @lastvalue = convert(int,ap_last_value) 
from ap_formula where ap_formula_id = @formula_id 

END 


Т.е. первым селектом ты ее и залочил.

Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32444763
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А где смысл транзакции тогда? В твоем варианте вообще не надо никакой транзакции!
В том коде, который ты прислал, при многопоточном обращении неизвестно, какой результат получит клиент! Если ты работал с этим, то сталкивался наверное!
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32444863
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgenyV

а в вашем случае транзакция и не нужна :)

PS> Поставьте лучше в начале SP
Код: plaintext
1.
2.
SET NOCOUNT ON
SET XACT_ABORT ON
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32444960
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть одно маленькое "НО".
Когда пользуюсь вашими советами, получаю больше одного раза одно и тоже значение! А поскольку процедура обеспечивает возврат уникального номера/стринга, не могу ей пльзоваться!
Спасибо
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32445004
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Когда пользуюсь вашими советами, получаю больше одного раза одно и тоже значение! А поскольку процедура обеспечивает возврат уникального номера/стринга, не могу ей пльзоваться!

А поподробнее это почему же?
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32445049
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что делает процедура: берет последний номер прибавляет, допустим 1 и возвращает клиенту. Если два клиента получат один и тот же номер - очень плёхо :). Будет, например, два человека с одним и тем же номером паспорта... или банковского счета - выбирай, что лучше :)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32445556
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, стормозил я маленько. Явная транзакция тут вообще не нужна.
ap_formula_id уникальное значение?


Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32446069
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно вы привели не весь код - но для указанного фрагмента транзакция не нужна :)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32446263
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В этом все дело, что уникальное. Самое прикольное, что если клиенты C++ COM, то все ок! А если .NET, но начинается эта фигня! Как я уже и писал WITH (NOLOCK) решает проблему и локировки нет и уникальность сохраняется. Все равно не могу понять, почему вообще локировался процесс...
Спасибо
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32446265
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
funikovyuri - привел весь код! Почему же не нужна транзакзия ? Нужна. Тогда зачем вообще транзакция существует? Просто долго писать и объяснять почему :)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32446288
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте разберемся, что есть ap_last_value?

При данныой конструкции и N клиентов если не блокировать таблицу, то всегда есть вероаятность что новый вызов успеет прочитать значение до апдейта.
Выходы:
1. Таки блокировать, ловить ошибку и перезапускать.
2. Использовать встроенные средства для разруливания ситуации, т.е. ap_last_value - identity. Выставляйте ему seed и возвращайте
Код: plaintext
 SCOPE_IDENTITY()


Вот это
Самое прикольное, что если клиенты C++ COM, то все ок! А если .NET, но начинается эта фигня
совсем не понятно. Проблема чисто серверная , отношения к клиенту не имеет. хм..
но если вы так говорите, давайте посмотрим.
Запустите трассу в обоих случаях и посмотрите что запускается на сервере.


Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32446566
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Magnus, спасибо за советы. К сожалению, identity не могу использовать - поддержка предыдущих старых версий.
Единственная разница на трассировке
(с одинаковым по умолчанию фильтром сообщений. Может Вы знаете, какую полезную инфо можно добавить в трассировку?)
в том, что ADO client запускает каждый раз Audit Login, который включает в себя набор команд
-- network protocol: LPC
set quoted_identifier on
set implicit_transactions off
set cursor_close_on_commit off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set language us_english
set dateformat mdy
set datefirst 7

Я эти команды вставил в начало процедуры - никакого результата.
Спасибо
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32447427
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нравиться мне когда говорят о транзакции - а ставят nolock
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32447553
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да я понимаю...что ничего не понимаю...:)
на самом деле! без "no lock" в транзакции - blocking, без транзакции без "no lock" - некорректные данные. работает вариант с "no lock" в транзакции...почему? не знаю. пока работает - пусть работает :)
трогать не буду. как только упаду первый раз на "key violation" с полученным номером - буду думать :)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32447653
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знач так,
set implicit_transactions off - это было в варинте без транзакции?

пробуем вот так:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

это должно быть установлено для каждого коннекта.
Вместе с транзакцией, как и было в начале.

Ждем результатов.


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

Я немного начинаю понимать :) В частности заметил output параметры...

Код: 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.
25.
26.
27.
28.
CREATE PROCEDURE sp_formula 
@formula_id varchar( 30 ), 
@calculationinterval int, 
@lastvalue integer output, 
@formulatext varchar( 50 ) output 
as 
SET NOCOUNT ON
SET XACTABORT ON

declare @period_type char ( 1 ) 
declare @ap_last_value varchar( 50 ) 
declare @ap_last_date datetime 
declare @ap_template varchar( 50 ) 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION 

select @period_type = period_type, @ap_last_date = ap_last_date, @formulatext = ap_template from ap_formula where ap_formula_id = @formula_id 

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 


select @lastvalue = convert(int,ap_last_value) 
from ap_formula where ap_formula_id = @formula_id 

END 
COMMIT TRANSACTION


Такое точно будет работать

А вот вариант получше - но это только мои догадки - так как я не понял зачем надо было last_value брать новое а ap_last_date - старое :)

Код: 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.
CREATE PROCEDURE sp_formula 
@formula_id varchar( 30 ), 
@calculationinterval int, 
@lastvalue integer output, 
@formulatext varchar( 50 ) output 
as 
SET NOCOUNT ON
SET XACTABORT ON

declare @period_type char ( 1 ) 
declare @ap_last_value varchar( 50 ) 
declare @ap_last_date datetime 
declare @ap_template varchar( 50 ) 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
BEGIN TRANSACTION 

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 

select @lastvalue = convert(int,ap_last_value),@period_type = period_type, @ap_last_date = ap_last_date, @formulatext = ap_template from ap_formula where ap_formula_id = @formula_id 

END 
COMMIT TRANSACTION
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32447698
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще могу сказать почему у вас работает вариант с nolock :)
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32447705
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот READ UNCOMMITTED думаю тут лишнее. Здесь вариант довольно простой, вызов один и тот же, тот же порядок операторов, поэтому READ COMMITTED с транзакцией. Дедлоков быть не должно. By Design.



Magnus
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32447752
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой... Там конечно же должен быть READ COMMITED ....
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32448287
EvgenyV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во-первых, всем спасибо!!!!!
Зашел из дома посмотреть, не выдержал:)
По поводу ap_last_date - просто я выбросил лишний код, который использует в дальнейшем этот параметр. В данном случае он совсем не нужен. Работает только приведенный мной кусок кода.

funikovyuri - А что с out параметрами? Они каким-то образом влияют?

Народ, если мне не изменяет память, если мы пишем BEGIN TRANSACTION, то по умолчанию это - BEGIN TRANSACTION READ COMMITED.

Спасибо
Буду на работе проверю все варианты!
...
Рейтинг: 0 / 0
MSS и дедлок при запуске stored procedure...
    #32448296
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот здесь начинается самое интересное. При использовании COM для связи с сиквелом уровень насильно выставляется как Serializable.
Так что, попробуйте
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Magnus
...
Рейтинг: 0 / 0
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
50 сообщений из 50, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / MSS и дедлок при запуске stored procedure...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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