ASP.NET会话管理DeleteExpiredSessions看起来很傻?

ASP.NET会话管理DeleteExpiredSessions看起来很傻?,asp.net,sql-server,session-state,Asp.net,Sql Server,Session State,我有一个版本的DeleteExpiredSessions(由Microsoft提供),它使用游标并将数据存储到临时表中 这是存储过程的源代码 CREATE PROCEDURE [dbo].[DeleteExpiredSessions] AS SET NOCOUNT ON SET DEADLOCK_PRIORITY LOW DECLARE @now datetime SET @now = GETUTCDATE() CREATE TABLE #tblE

我有一个版本的DeleteExpiredSessions(由Microsoft提供),它使用游标并将数据存储到临时表中

这是存储过程的源代码

CREATE PROCEDURE [dbo].[DeleteExpiredSessions]
AS
    SET NOCOUNT ON
    SET DEADLOCK_PRIORITY LOW 

    DECLARE @now datetime
    SET @now = GETUTCDATE() 

    CREATE TABLE #tblExpiredSessions 
    ( 
        SessionID nvarchar(88) NOT NULL PRIMARY KEY
    )

    INSERT #tblExpiredSessions (SessionID)
        SELECT SessionID
        FROM dbo.ASPStateTempSessions WITH (READUNCOMMITTED)
        WHERE Expires < @now

    IF @@ROWCOUNT <> 0 
    BEGIN 
        DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY
        FOR SELECT SessionID FROM #tblExpiredSessions 

        DECLARE @SessionID nvarchar(88)

        OPEN ExpiredSessionCursor

        FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID

        WHILE @@FETCH_STATUS = 0 
            BEGIN
                DELETE FROM dbo.ASPStateTempSessions WHERE SessionID = @SessionID AND Expires < @now
                FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
            END

        CLOSE ExpiredSessionCursor

        DEALLOCATE ExpiredSessionCursor

    END 

    DROP TABLE #tblExpiredSessions

RETURN 0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
创建过程[dbo]。[DeleteExpiredSessions]
作为
不计较
将死锁设置为低优先级
声明@now datetime
SET@now=GETUTCDATE()
创建表#tblExpiredSessions
( 
SessionID nvarchar(88)主键不为空
)
插入#tblExpiredSessions(SessionID)
选择SessionID
从dbo.ASPStateTempSessions与(READUNCOMMITTED)
现在在哪里
如果@@ROWCOUNT 0
开始
声明ExpiredSessionCursor游标本地转发只读
对于从#tblExpiredSessions中选择SessionID
声明@SessionID nvarchar(88)
打开过期的sessioncursor
从ExpiredSessionCursor获取下一个到@SessionID
而@@FETCH\u STATUS=0
开始
从dbo.ASPStateTempSessions中删除,其中SessionID=@SessionID并立即过期
从ExpiredSessionCursor获取下一个到@SessionID
结束
关闭过期的sessioncursor
取消分配过期的SessionCursor
结束
DROP TABLE#tblExpiredSessions
返回0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
我想知道为什么不使用下面的查询简单地删除过期的会话:

DELETE [ASPState].dbo.ASPStateTempSessions
WHERE Expires < GETUTCDATE()
DELETE[ASPState].dbo.ASPStateTempSessions
其中Expires
查看代码并考虑潜在的数据库负载和数据量,我认为这样做的原因是为了防止清理脚本导致可能升级和干扰应用程序的锁。会话表将位于每个web请求的关键路径上。

查看代码并考虑潜在的数据库负载和数据量,我认为这样做的原因是为了防止清理脚本导致锁升级并干扰应用程序。会话表将位于每个web请求的关键路径上。

为什么这太宽了?应该有一些原因,他们以这种方式实现或它是错误的。为什么这太宽了?应该有一些原因,他们以这种方式实现或它是错误的。这是有意义的。我忽略了行的数量可能很大,这可能会导致表锁定。如果没有更好的答案,我会接受你的。非常感谢。有道理。我忽略了行的数量可能很大,这可能会导致表锁定。如果没有更好的答案,我会接受你的。非常感谢。