Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите плиз разобраться с процедурой.  [new]
abrashka
Member

Откуда:
Сообщений: 521
День добрый!

Существует процедура, которая апдейтит определенную строку в таблице транзакций.
При запуске из приложения бежит 30 секунд и таймаут, в профайлере вижу, что таки бежит 30 секунд, когда запускаю процедуру в SSMS(вытаскиваю код из профайлера с параметрами)- бежит меньше секунды.

Добавил в процедуру логи, чтоб понять где именно она падает.
Создал таблицу:
create table UpdateTransaction_log (id int identity(1,1), TransactionNumber int, StartTime datetime, 
Log1 datetime,Log2 datetime,Log3 datetime,Log4 datetime,Log5 datetime,Log6 datetime,Log7 datetime,
LogCatchStart datetime,LogCatchEnd datetime,EndTime datetime)


Из которой видно, что Log2 записывается, а уже Log3- нет. После Log2 вообще не записывается в лог ничего, т.е. процедура падает между 2 и 3.
Вот собственно и процедура:
CREATE PROCEDURE [Sales].[usp_UpdateTransaction]
(
	@inHolderCompanyId		AS INT ,
	@inTransactionNumber	AS INT ,
	@inTransactionStateEnum	AS INT ,
	@inIsPrintable			AS BIT
)
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

-- Declarations

--DECLARE @intTransationCount		AS INT;
DECLARE @nvcTransactionName		AS NVARCHAR(32);
DECLARE @intErrorSeverity		AS INT;
DECLARE @intErrorState			AS INT;
DECLARE @intTransactionLocalId	AS INT;
DECLARE	@uiTransactionGUID		AS UNIQUEIDENTIFIER;



Declare @LastId int
insert into UpdateTransaction_log(TransactionNumber, StartTime)
Select @inTransactionNumber,GETDATE()
Set @LastId=(select MAX(Id) from UpdateTransaction_log where TransactionNumber=@inTransactionNumber)


--SET @intTransationCount	= @@TRANCOUNT;
SET @nvcTransactionName	= N'UpdateTransaction';

BEGIN TRY
update UpdateTransaction_log
set Log1=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber
 

	-- Get the transaction local Id and GUID

	SELECT
		@intTransactionLocalId	= trnLocalId ,
		@uiTransactionGUID		= trnGUID
	FROM
		Sales.Transactions  with (nolock)
	WHERE
		trnHolderCompanyId = @inHolderCompanyId
	AND
		trnIssuerCompanyId = @inHolderCompanyId
	AND
		trnGlobalNumber = @inTransactionNumber;
		
update UpdateTransaction_log
set Log2=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber
 		

	-- Begin a transaction

	BEGIN TRANSACTION MyTran


update UpdateTransaction_log
set Log3=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber
 
------   SOME CODE HERE  -------/


update UpdateTransaction_log
set Log6=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber
 
	END;

	-- Commit the transaction

	COMMIT TRANSACTION MyTran

update UpdateTransaction_log
set Log7=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber
 



 
END TRY
BEGIN CATCH
update UpdateTransaction_log
set LogCatchStart=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber
 

------   SOME CODE HERE  -------/

update UpdateTransaction_log
set LogCatchEnd=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber
 		

END CATCH;
update UpdateTransaction_log
set EndTime=GETDATE()
where ID=@LastId
and TransactionNumber=@inTransactionNumber


Транзакция MyTran не начинается вообще :( И CATCH тоже...
Помогите плз разобраться с ситуацией, почему не начинается транзакция и процдура падаед не дойдя до CATCH?
14 май 14, 13:26    [16015200]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
abrashka
Помогите плз разобраться с ситуацией, почему не начинается транзакция и процдура падаед не дойдя до CATCH?
СТранный у вас способ отладки.

Первой строкой в CATCH поставьте SELECT ERROR_MESSAGE ( ), что ли...
14 май 14, 14:19    [16015534]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
abrashka
Помогите плз разобраться с ситуацией, почему не начинается транзакция и процдура падаед не дойдя до CATCH?

Потому, что в вашем клиентском приложении установлен таймаут на время ожидания окончания запроса.
И приложение тупо прерывает выполнение, а "процедура падает"
14 май 14, 14:30    [16015616]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
автор
Из которой видно, что Log2 записывается, а уже Log3- нет.

т.к. между log2 и log3
автор
BEGIN TRANSACTION MyTran



автор
END;

А где BEGIN?
14 май 14, 14:32    [16015634]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
abrashka
Member

Откуда:
Сообщений: 521
Glory,

Спасибо,
Интересно почему процедура с теми же параметрами бежит меньше секунды через SSMS, а из приложения через 30 секунд падает...
14 май 14, 14:57    [16015891]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
abrashka
Member

Откуда:
Сообщений: 521
alexeyvg,

Спасибо,
Не хотел собавлять лишний код, на самом деле в CATCH все есть, в оригинале:
BEGIN CATCH

	SET @intErrorSeverity	= ERROR_SEVERITY ();
	SET @intErrorState		= ERROR_STATE ();

	EXECUTE Infra.usp_HandleError
		@inTransactionCount	= 0, --@intTransationCount ,
		@inTransactionName	= @nvcTransactionName ,
		@inErrorSeverity	= @intErrorSeverity ,
		@inErrorState		= @intErrorState;

END CATCH;


Владислав Колосов ,
С бегинами и ендами все в порядке, просто не скопировал код полностью

Еще раз, процедура нормально бежит из Management Studio, бежит меньше секунды, апдейтит одно поле одной строки, никаких джоинов на другие таблицы нет.
Через приложение падает в одном и том же месте через 30 секунд, судя по всему не начинает транзакцию вообще.
14 май 14, 15:02    [16015949]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
abrashka
Member

Откуда:
Сообщений: 521
И вот такое наблюдение, от старта до log2 проходит несколько милисекунд, после этого процедура падает, не доходя до Log3, т.е. транзакция не начинается вообще. Если таймаут приложения 30 секунд, то хотябы Log3 должен был бы записаться? Или если транзакция началась и приложение прекратило запуск процедуры из-за таймаута, то произошел ролбек апдайта Log3?
14 май 14, 15:11    [16016016]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
abrashka
Еще раз, процедура нормально бежит из Management Studio, бежит меньше секунды, апдейтит одно поле одной строки, никаких джоинов на другие таблицы нет.
Через приложение падает в одном и том же месте через 30 секунд, судя по всему не начинает транзакцию вообще.

http://www.somewheresomehow.ru/fast-in-ssms-slow-in-app-part1/
http://www.somewheresomehow.ru/fast-in-ssms-slow-in-app-part2/
http://www.somewheresomehow.ru/fast-in-ssms-slow-in-app-part3/
14 май 14, 15:11    [16016020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
abrashka
Или если транзакция началась и приложение прекратило запуск процедуры из-за таймаута, то произошел ролбек апдайта Log3?
Да, если коннект разрывается, то текущая транзакция откатывается.

abrashka
Не хотел собавлять лишний код, на самом деле в CATCH все есть, в оригинале:
Какая то процедура...
Просто SELECT нельзя сделать? Запись в лог - это менее надёжно, поскольку в самой записи можно сделать ошибку. Например, не сделать откат перед записью, да мало ли что.

И вообще, что там, в Infra.usp_HandleError? Записи текста ошибки уже нет, например.
14 май 14, 15:45    [16016340]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
abrashka
Еще раз, процедура нормально бежит из Management Studio, бежит меньше секунды, апдейтит одно поле одной строки, никаких джоинов на другие таблицы нет.
Через приложение падает в одном и том же месте через 30 секунд, судя по всему не начинает транзакцию вообще.
Падает? Бежит?

Точнее выражайтесь, номер и текст сообщения об ошибке. Если не можете получить - решайте сначала этот вопрос.

Возможно, другие коннекты держат транзакцию, и следующее выполнение останавливается, ожидая освобождения ресурса (например, таблицы лога или ещё чего то).
Можно посмотреть, нет ли блокировок, запустив sp_who2
14 май 14, 15:48    [16016364]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Добрый день. Чтобы не создавать новые темы напишу тут.
Есть код T-sql в процедуре. С основной частью вроде разобрался. Но в последнем IF не могу понять что делает EXEC.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[sp_WriteHourMinMax24]  (@ParamID int, @DateTime SmallDatetime, @DataMin real, @DataMax real ) AS
DECLARE @CurrentDate SmallDatetime
DECLARE @str_CurrentDate SYSNAME
DECLARE @str_Hour SYSNAME
DECLARE @str_ParamID SYSNAME
DECLARE @str_DataMin SYSNAME
DECLARE @str_DataMax SYSNAME
SELECT @str_ParamID = convert(SYSNAME,@ParamID)
--IF datepart( MINUTE, @DateTime)  <> 0 
 SELECT @str_Hour = convert(SYSNAME,datepart(HOUR, @DateTime) +1)
--IF datepart( MINUTE, @DateTime)  = 0 -- and datepart( HOUR, @DateTime)  <> 0
-- SELECT @str_Hour = convert(SYSNAME,datepart(HOUR, @DateTime) )
IF datepart( MINUTE, @DateTime)  = 0 and datepart( HOUR, @DateTime)  = 0
BEGIN
 SELECT @str_Hour = 1
END
SELECT @CurrentDate = convert(SmallDateTime, convert(varchar,@DateTime,112))
SELECT @str_CurrentDate=convert( SYSNAME, @CurrentDate,112)
IF @DataMin is NULL
 SELECT @str_DataMin = 'NULL'
ELSE
 SELECT @str_DataMin = convert(SYSNAME,@DataMin)
IF @DataMax is NULL
 SELECT @str_DataMax = 'NULL'
ELSE
 SELECT @str_DataMax = convert(SYSNAME,@DataMax)
IF (SELECT count(IDMeas) FROM DataHourExtr WHERE IDMeas=@ParamID AND [Date]=@CurrentDate)=0
 INSERT INTO DataHourExtr(IDMeas,[Date])  VALUES(@ParamID,@CurrentDate)
[SIZE=2][u][b]EXEC[/b][/u][/SIZE]('UPDATE DataHourExtr SET ValueMin' + @str_Hour +'=' + @str_DataMin + ',ValueMax' + @str_Hour +'=' + @str_DataMax +  '  WHERE IDMeas=' + @str_ParamID + ' AND [Date]="' + @str_CurrentDate + '"')
28 май 14, 13:42    [16085164]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
Но в последнем IF не могу понять что делает EXEC.

Прочитать в хелпе не пробовали, что же делает EXEC ?

Сообщение было отредактировано: 28 май 14, 13:44
28 май 14, 13:44    [16085182]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Glory,
EXEC - выполняет выражение
'UPDATE DataHourExtr SET ValueMin' + @str_Hour +'=' + @str_DataMin + ',ValueMax' + 
@str_Hour +'=' + @str_DataMax +  '  WHERE IDMeas=' + @str_ParamID + ' AND [Date]="' + @str_CurrentDate + '"'


А вот что конкретно делает это выражение не могу понять.
28 май 14, 13:58    [16085314]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
А вот что конкретно делает это выражение не могу понять.

замените exec на print или select и увидите
28 май 14, 14:00    [16085328]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Glory, очень сильно извиняюсь. Поменял как вы советовали. Но результат не знаю где посмотреть. В sql server 2008 в событиях после выполнения запроса пишет "Выполнение команд успешно завершено." но наглядного результата все равно нет.
28 май 14, 14:07    [16085393]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
В sql server 2008 в событиях после выполнения запроса пишет "Выполнение команд успешно завершено."

А какую команду вы выполнили то ?
28 май 14, 14:09    [16085416]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Glory,

видимо неправильно пользуюсь оператором. Подскажите пожалуйста как правильно его вставить в данную процедуру чтоб увидеть выполняемый результат.
28 май 14, 14:16    [16085465]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
видимо неправильно пользуюсь оператором.

Еще раз вопрос - какую команды вы выполнили, если получили "Выполнение команд успешно завершено."
28 май 14, 14:17    [16085470]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Glory,
+

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[sp_WriteHourMinMax24]  (@ParamID int, @DateTime SmallDatetime, @DataMin real, @DataMax real ) AS
DECLARE @CurrentDate SmallDatetime
DECLARE @str_CurrentDate SYSNAME
DECLARE @str_Hour SYSNAME
DECLARE @str_ParamID SYSNAME
DECLARE @str_DataMin SYSNAME
DECLARE @str_DataMax SYSNAME
SELECT @str_ParamID = convert(SYSNAME,@ParamID)
--IF datepart( MINUTE, @DateTime)  <> 0 
 SELECT @str_Hour = convert(SYSNAME,datepart(HOUR, @DateTime) +1)
--IF datepart( MINUTE, @DateTime)  = 0 -- and datepart( HOUR, @DateTime)  <> 0
-- SELECT @str_Hour = convert(SYSNAME,datepart(HOUR, @DateTime) )
IF datepart( MINUTE, @DateTime)  = 0 and datepart( HOUR, @DateTime)  = 0
BEGIN
 SELECT @str_Hour = 1
END
SELECT @CurrentDate = convert(SmallDateTime, convert(varchar,@DateTime,112))
SELECT @str_CurrentDate=convert( SYSNAME, @CurrentDate,112)
IF @DataMin is NULL
 SELECT @str_DataMin = 'NULL'
ELSE
 SELECT @str_DataMin = convert(SYSNAME,@DataMin)
IF @DataMax is NULL
 SELECT @str_DataMax = 'NULL'
ELSE
 SELECT @str_DataMax = convert(SYSNAME,@DataMax)
IF (SELECT count(IDMeas) FROM DataHourExtr WHERE IDMeas=@ParamID AND [Date]=@CurrentDate)=0
 INSERT INTO DataHourExtr(IDMeas,[Date])  VALUES(@ParamID,@CurrentDate)
PRINT ('UPDATE DataHourExtr SET ValueMin' + @str_Hour +'=' + @str_DataMin + ',ValueMax' + 
@str_Hour +'=' + @str_DataMax +  '  WHERE IDMeas=' + @str_ParamID + ' AND [Date]="' + @str_CurrentDate + '"')

28 май 14, 14:20    [16085494]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
И какой вывод вы хотите от команды, которая меняет текст процедуры ?
28 май 14, 14:22    [16085504]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Glory, добавил в код несколько printов,"выполнение команд успешно завершено", но никаких других сообщений нет.
+

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[sp_WriteHourMinMax24]  (@ParamID int, @DateTime SmallDatetime, @DataMin real, @DataMax real ) AS
DECLARE @CurrentDate SmallDatetime
DECLARE @str_CurrentDate SYSNAME
DECLARE @str_Hour SYSNAME
DECLARE @str_ParamID SYSNAME
DECLARE @str_DataMin SYSNAME
DECLARE @str_DataMax SYSNAME
SELECT @str_ParamID = convert(SYSNAME,@ParamID)
--IF datepart( MINUTE, @DateTime)  <> 0 
 SELECT @str_Hour = convert(SYSNAME,datepart(HOUR, @DateTime) +1)
--IF datepart( MINUTE, @DateTime)  = 0 -- and datepart( HOUR, @DateTime)  <> 0
-- SELECT @str_Hour = convert(SYSNAME,datepart(HOUR, @DateTime) )
IF datepart( MINUTE, @DateTime)  = 0 and datepart( HOUR, @DateTime)  = 0
BEGIN
 SELECT @str_Hour = 1
 print @str_Hour
END
SELECT @CurrentDate = convert(SmallDateTime, convert(varchar,@DateTime,112))
print @CurrentDate
SELECT @str_CurrentDate=convert( SYSNAME, @CurrentDate,112)
print @str_CurrentDate
IF @DataMin is NULL
 SELECT @str_DataMin = 'NULL'
ELSE
 SELECT @str_DataMin = convert(SYSNAME,@DataMin)
 print @str_DataMin
IF @DataMax is NULL
 SELECT @str_DataMax = 'NULL'
 ELSE
 SELECT @str_DataMax = convert(SYSNAME,@DataMax)
 IF (SELECT count(IDMeas) FROM DataHourExtr WHERE IDMeas=@ParamID AND [Date]=@CurrentDate)=0
 INSERT INTO DataHourExtr(IDMeas,[Date])  VALUES(@ParamID,@CurrentDate)
 Exec ('UPDATE DataHourExtr SET ValueMin' + @str_Hour +'=' + @str_DataMin + ',ValueMax' + 
@str_Hour +'=' + @str_DataMax +  '  WHERE IDMeas=' + @str_ParamID + ' AND [Date]="' + @str_CurrentDate + '"')
print @str_DataMin


что неправильно делаю?
28 май 14, 14:57    [16085779]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
что неправильно делаю?

Вы почему продолжаете считать, что редактирование текста процедуры равносильно запуску процедуры.
28 май 14, 14:58    [16085792]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
ncux199rus
Glory,
EXEC - выполняет выражение
'UPDATE DataHourExtr SET ValueMin' + @str_Hour +'=' + @str_DataMin + ',ValueMax' + 
@str_Hour +'=' + @str_DataMax +  '  WHERE IDMeas=' + @str_ParamID + ' AND [Date]="' + @str_CurrentDate + '"'


А вот что конкретно делает это выражение не могу понять.


Выполняет UPDATE DataHourExtr . Это построение так называемого динамического запроса.
28 май 14, 15:00    [16085808]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
Владислав Колосов, спасибо.
Glory, извините, в sql изучаю с начала мая и нужно разобраться в уже существующей системе. Так что фундаментальных знаний не хватает.
28 май 14, 16:47    [16086784]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плиз разобраться с процедурой.  [new]
Glory
Member

Откуда:
Сообщений: 104751
ncux199rus
Glory, извините, в sql изучаю с начала мая и нужно разобраться в уже существующей системе. Так что фундаментальных знаний не хватает.

Для того, чтобы отличать редактирование от выполнения, нужна элементарная логика
28 май 14, 17:03    [16086888]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить