2013-12-22 18 views
0

У меня возникла небольшая проблема в моем SQL-запросе. Следующая ошибка:SQL SERVER - Истекло время ожидания. Период ожидания, прошедший до завершения операции, или сервер не отвечает

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 

И вот мой SQL Query

ALTER PROC sp_savepresence 
@Username char(20), 
@Image text 
AS 
BEGIN 
------------ 
DECLARE @PresStatus CHAR, 
     @DateDiff INT, 
     @ClockIn DATETIME, 
     @InsertData varchar(20) = 'TranSavePresence'; 
     IF NOT EXISTS(SELECT Username FROM PresenceTransaction WHERE [email protected] AND ClockOut IS NULL) 
     BEGIN 
      BEGIN TRANSACTION @InsertData 
       INSERT INTO PresenceTransaction 
       (
        Username, 
        [Image], 
        PresenceStatus, 
        WorkHour, 
        ClockIn, 
        ClockOut 
       ) 
       VALUES 
       (
        @Username, 
        @Image, 
        'N', 
        0, 
        getdate(), 
        NULL 
       ) 
END 
ELSE 
BEGIN 
    SELECT @ClockIn = ClockIn, @DateDiff = DateDiff(MINUTE, @ClockIn, getDate()) FROM PresenceTransaction WHERE [email protected] AND ClockOut IS NULL AND PresenceStatus = 'N' 
    IF @DateDiff IS NOT NULL  
    BEGIN 
     SELECT @PresStatus = 'P' 
    END 
    ELSE 
    BEGIN 
     SELECT @PresStatus='N' 
    END 

    UPDATE PresenceTransaction 
     SET 
      PresenceStatus = @PresStatus, 
      WorkHour = @DateDiff, 
      ClockOut = getDate() 
     WHERE [email protected] AND ClockOut IS NULL AND PresenceStatus = 'N' 
END 

------------ 
IF(@@Error <> 0) 
BEGIN 
    PRINT @@Error 
    Rollback Tran @InsertData 
    SELECT @@Error AS [Status] 
END 
ELSE  
BEGIN 
    COMMIT TRAN @InsertData 
    SELECT 'True' AS [Status] 
END 
END 
GO 

Я уже прочитал от некоторых статей через Интернет, и некоторые из статей, скажите мне настроить мой запрос. Но я не знаю, где точка ошибки или, возможно, тупиковая точка, и я не знаю, как настроить мой код запроса. Спасибо :)

+0

Если вы хотите проверить наличие строки и, в зависимости от результата, выполнить некоторую другую работу, то все должно быть внутри одной транзакции. В противном случае строка может быть создана между проверенным временем и временем, когда вы пытаетесь вставить INSERT. – HABO

ответ

2

Ваш код хранимой процедуры условно запускает транзакцию, но совершает ошибку, если не существует ошибки, а не проверяется, выполняется ли транзакция. См. @@TRANCOUNT.

Тот факт, что вы пытаетесь использовать именованную транзакцию, предполагает наличие других транзакций, которые могут быть активными. Если вы не гуру (и я не) Я бы настоятельно предложил не использовать названные вложенные транзакции. Трудно получить право и часто приводит к запутанному, трудному поддержанию кода.

+0

Я попытался проверить с помощью @@ TRANCOUNT, и он вернул результат 3. –

+0

Тогда у вас также есть другие проблемы. Тот факт, что вы пытаетесь использовать именованную транзакцию, предполагает наличие других транзакций, которые могут присутствовать? Если вы не гуру (а я нет), не используйте названные вложенные транзакции –

+0

hmm Что такое код, если он успешный? –

Смежные вопросы

 Смежные вопросы