SQL语句反复锁定

时间:2017-08-06 15:59:27

标签: sql sql-server sql-server-2012 transactionscope sqltransaction

您好我面临一个关键问题,因为2周后,触发器中涉及的所有表都被锁定在某个场景中,而不是在生产区域的Web应用程序中加载视图页面。下面的SQL语句在同一个request_session_id中连续命中,当客户端使用应用程序时发生锁定,然后触发器中的所有表都被锁定,然后系统在重新启动数据库和IIS服务后工作。不了解问题的原因。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_UpdateWorkFlowStatus]
ON [dbo].[Wf_WorkflowTaskInstanceDocuments]
FOR INSERT, UPDATE
AS
BEGIN
print ''
    SET NOCOUNT ON;
     DELETE FROM triggertest
    DECLARE @Action as char(1);
    SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
                         AND EXISTS(SELECT * FROM DELETED)
                        THEN 'U'  -- Set Action to Updated.
                        WHEN EXISTS(SELECT * FROM INSERTED)
                        THEN 'I'  -- Set Action to Insert.
                        WHEN EXISTS(SELECT * FROM DELETED)
                        THEN 'D'  -- Set Action to Deleted.
                        ELSE NULL -- Skip. It may have been a "failed delete".   
                    END)


    DECLARE @WorkFlowNo BIGINT =(select top 1 WrokflowInstanceId from Wf_WorkflowTaskInstance WITH (NOLOCK) join inserted on inserted.WorkflowTaskInstanceId= Wf_WorkflowTaskInstance.WorkflowTaskInstanceId)
    IF NOT EXISTS(SELECT 1 FROM Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK)
                            WHERE WorkflowTaskInstanceId IN
                            (
                                    select WorkflowTaskInstanceId 
                                    from Wf_WorkflowTaskInstance 
                                    WHERE WrokflowInstanceId=@WorkFlowNo and Status<>4
                            ) 
                            AND 
                            (IsSubmitted = 0 OR IsSubmitted IS NULL)
                 ) 
    BEGIN
         UPDATE Wf_WorkflowInstance SET Status='Completed' where WorkflowInstanceId=@WorkFlowNo
    END
    ELSE IF EXISTS(SELECT 1 FROM Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK)
                            WHERE WorkflowTaskInstanceId IN
                            (
                                    select WorkflowTaskInstanceId 
                                    from Wf_WorkflowTaskInstance 
                                    WHERE WrokflowInstanceId=@WorkFlowNo
                            ) 
                            AND 
                            (IsSubmitted = 1)
                 ) 
    BEGIN
        UPDATE Wf_WorkflowInstance SET Status='InProgress' where WorkflowInstanceId=@WorkFlowNo
    END
    if exists(select 1  from Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK) where participants is null)
        update Wf_WorkflowTaskInstanceDocuments set participants=dbo.[GetTaskDocumentAssignees](WorkflowTaskInstanceDocumentsId)  where participants is null 

    if(@Action='u')
    begin
        if exists(select 1 from Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK) where len(ToParticipants)<>len(dbo.UDF_DistinctList(ToParticipants,',')) and WorkflowTaskInstanceDocumentsId in(select WorkflowTaskInstanceDocumentsId from inserted))
        begin
            update Wf_WorkflowTaskInstanceDocuments set ToParticipants=dbo.UDF_DistinctList(ToParticipants,','),participants=dbo.[GetTaskDocumentAssignees](WorkflowTaskInstanceDocumentsId) 
            where WorkflowTaskInstanceDocumentsId in(select WorkflowTaskInstanceDocumentsId from inserted)
        end
        else
            update Wf_WorkflowTaskInstanceDocuments set participants=dbo.[GetTaskDocumentAssignees](WorkflowTaskInstanceDocumentsId)  where WorkflowTaskInstanceDocumentsId in(select WorkflowTaskInstanceDocumentsId from inserted)
    end

     if(@Action='I')
     BEGIN  
                     insert into Wf_WorkflowTaskDocumentVersionMapping
                     (
                         WorkflowTaskInstanceId,
                         Wf_WorkflowInstanceDocID,
                         DocRegisterID
                     )
                     select  
                     WorkflowTaskInstanceId,
                     WorkflowTaskInstanceDocumentsId,
                     DocumentRegisterID
                     from 
                     Wf_WorkflowTaskInstanceDocuments WHERE WorkflowTaskInstanceDocumentsId not IN(SELECT Wf_WorkflowInstanceDocID FROM Wf_WorkflowTaskDocumentVersionMapping WITH (NOLOCK))

                   DECLARE @DOCID AS TABLE
                            (
                              DocumentRegisterID INT,
                              WorkflowTaskInstanceDocumentsId INT,
                              WorkflowTaskInstanceId INT
                            )
                            DECLARE @WorkflowTaskInstanceId INT
                            DECLARE @WorkflowInstanceId INT=0
                            DECLARE @CurrentWorkflowInstanceId INT=0
                            DECLARE @DocumentRegisterID INT=0
                            DECLARE @WorkflowTaskInstanceDocumentsId INT=0
                            DECLARE @Wf_WorkflowTaskDocumentVersionMapping INT=0
                            DECLARE @Wf_TaskInstanceLocal INT=0
                            DECLARE @RowCount int=0
                            DECLARE @DocVersionLocal int
                            DECLARE @RevisionLocal varchar(25)
                            DECLARE @FirstTaskInstanceID int=(select top 1 wti.WorkflowTaskInstanceId from Wf_WorkflowTaskDocumentVersionMapping wtid
                                                 join Wf_WorkflowTaskInstance  wti WITH (NOLOCK) on wtid.WorkflowTaskInstanceId=wti.WorkflowTaskInstanceId
                                                 where wti.WrokflowInstanceId IN(@WorkFlowNo) order by wti.WorkflowTaskInstanceId)
                            DELETE FROM @DOCID
                            INSERT INTO @DOCID SELECT DocumentRegisterID,WorkflowTaskInstanceDocumentsId,WorkflowTaskInstanceId FROM Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK) WHERE WorkflowTaskInstanceId=@FirstTaskInstanceID 


                            DECLARE @AdsdDocVersionMappingParent CURSOR
                            SET @AdsdDocVersionMappingParent = CURSOR FAST_FORWARD
                            FOR
                                select DocumentRegisterID
                                ,WorkflowTaskInstanceId 
                                from @DOCID
                            OPEN @AdsdDocVersionMappingParent
                            FETCH NEXT FROM @AdsdDocVersionMappingParent
                            INTO @DocumentRegisterID
                            ,@WorkflowTaskInstanceId
                            WHILE @@FETCH_STATUS = 0
                            BEGIN
                            set @DocVersionLocal=(select top 1 DocVersion from DocumentRegisterLogs where source like '%auto superseded by workflow%' and DocumentRegisterID=@DocumentRegisterID order by DocumentRegisterLogsID desc)
                            set @RevisionLocal=(select top 1 Revision from DocumentRegisterLogs where source like '%auto superseded by workflow%' and DocumentRegisterID=@DocumentRegisterID order by DocumentRegisterLogsID desc)
                                                    DECLARE @AdsdDocVersionMapping CURSOR
                                                    SET @AdsdDocVersionMapping = CURSOR FAST_FORWARD
                                                    FOR
                                                    select wti.WorkflowTaskInstanceId,wtid.Wf_WorkflowInstanceDocID 
                                                    from Wf_WorkflowTaskDocumentVersionMapping wtid WITH (NOLOCK)
                                                    join Wf_WorkflowTaskInstance wti WITH (NOLOCK) on wtid.WorkflowTaskInstanceId=wti.WorkflowTaskInstanceId
                                                    where wti.WrokflowInstanceId IN(@WorkFlowNo) and wtid.DocRegisterID is null
                                                    OPEN @AdsdDocVersionMapping
                                                    FETCH NEXT FROM @AdsdDocVersionMapping
                                                    INTO @WorkflowTaskInstanceId,@WorkflowTaskInstanceDocumentsId
                                                    WHILE @@FETCH_STATUS = 0
                                                    BEGIN
                                                                if not exists(select 1 from Wf_WorkflowTaskDocumentVersionMapping where DocRegisterID=@DocumentRegisterID and WorkflowTaskInstanceId=@WorkflowTaskInstanceId and DocRegisterID is not null)
                                                                begin
                                                                         update Wf_WorkflowTaskDocumentVersionMapping set DocRegisterID=@DocumentRegisterID where Wf_WorkflowInstanceDocID=@WorkflowTaskInstanceDocumentsId 
                                                                         update Wf_WorkflowTaskDocumentVersionMapping set DocVersion=@DocVersionLocal,Revision=@RevisionLocal where Wf_WorkflowInstanceDocID=@WorkflowTaskInstanceDocumentsId  
                                                                         select @WorkflowTaskInstanceDocumentsId
                                                                end
                                                                        --//////=
                                                                            update a set a.DocVersion=b.DocVersion
                                                                            from Wf_WorkflowTaskDocumentVersionMapping a
                                                                            join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
                                                                            join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
                                                                            where b.Source like '%auto superseded by workflow%' and (a.DocVersion is null)
                                                                            and wti.WrokflowInstanceId=@WorkFlowNo
                                                                            and wti.WorkflowTaskInstanceId=@WorkflowTaskInstanceId

                                                                            update a set a.Revision=b.Revision
                                                                            from Wf_WorkflowTaskDocumentVersionMapping a
                                                                            join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
                                                                            join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
                                                                            where b.Source like '%auto superseded by workflow%' and (a.Revision is null)
                                                                            and wti.WrokflowInstanceId=@WorkFlowNo
                                                                            and wti.WorkflowTaskInstanceId=@WorkflowTaskInstanceId
                                                                        --//////

                                                    FETCH NEXT FROM @AdsdDocVersionMapping
                                                    INTO @WorkflowTaskInstanceId,@WorkflowTaskInstanceDocumentsId
                                                    END
                                                    CLOSE @AdsdDocVersionMapping
                                                    DEALLOCATE @AdsdDocVersionMapping
                            FETCH NEXT FROM @AdsdDocVersionMappingParent
                            INTO @DocumentRegisterID
                            ,@WorkflowTaskInstanceId
                            END
                            CLOSE @AdsdDocVersionMappingParent
                            DEALLOCATE @AdsdDocVersionMappingParent
                update a set a.DocVersion=b.DocVersion
                from Wf_WorkflowTaskDocumentVersionMapping a
                join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
                join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
                where b.Source like '%auto superseded by workflow%' and (a.DocVersion is null)
                and wti.WrokflowInstanceId=@WorkFlowNo


                update a set a.Revision=b.Revision
                from Wf_WorkflowTaskDocumentVersionMapping a
                join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
                join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
                where b.Source like '%auto superseded by workflow%' and (a.Revision is null)
                and wti.WrokflowInstanceId=@WorkFlowNo
                and b.DocumentRegisterLogsID in(select top 1000 DocumentRegisterLogsID from DocumentRegisterLogs where DocumentRegisterID=b.DocumentRegisterID order by DocumentRegisterLogsID desc)
     END
       if(@Action='u')
       BEGIN
               DECLARE @DocumentNoInst varchar(120)
               DECLARE @DocumentNoVer varchar(120)
               DECLARE @DocumentIDVer int
               DECLARE @DocumentVer int
               DECLARE @DocInID int
               SELECT @DocumentNoInst=dr.DocumentNo,@DocInID=WorkflowTaskInstanceDocumentsId FROM inserted ins JOIN DocumentRegister dr on ins.DocumentRegisterID=dr.DocumentRegisterID
               SELECT @DocumentNoVer=dr.DocumentNo FROM Wf_WorkflowTaskDocumentVersionMapping insver JOIN DocumentRegister dr WITH (NOLOCK) on insver.DocRegisterID=dr.DocumentRegisterID  where Wf_WorkflowInstanceDocID=@DocInID 
               if(@DocumentNoInst<>@DocumentNoVer)
               begin
                       select top 1 @DocumentIDVer=DocRegisterID,@DocumentVer=insver.DocVersion from Wf_WorkflowTaskDocumentVersionMapping insver JOIN DocumentRegister dr on insver.DocRegisterID=dr.DocumentRegisterID
                                              where WorkflowTaskInstanceId in(@FirstTaskInstanceID) and dr.DocumentNo=@DocumentNoInst
                        update Wf_WorkflowTaskDocumentVersionMapping set DocRegisterID=@DocumentIDVer,DocVersion=@DocumentVer where Wf_WorkflowInstanceDocID=@DocInID
               end

       END
         -----------------------------------------***********************************-------------------------------------------
     Declare @AllTasksCount int=(select count(1) from Wf_WorkflowTaskInstance WITH (NOLOCK) where WrokflowInstanceId=@WorkFlowNo)
     declare @SkippedTasksCount int=(select count(1) from Wf_WorkflowTaskInstance WITH (NOLOCK) where WrokflowInstanceId=@WorkFlowNo and Status=4)
     if(@AllTasksCount=@SkippedTasksCount)
     begin
        update Wf_WorkflowInstance set Status='Skipped' where WorkflowInstanceId=@WorkFlowNo
     end
END

0 个答案:

没有答案