ASP.NET会话管理DeleteExpiredSessions看起来很傻?
我有一个版本的DeleteExpiredSessions(由Microsoft提供),它使用游标并将数据存储到临时表中 这是存储过程的源代码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
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请求的关键路径上。为什么这太宽了?应该有一些原因,他们以这种方式实现或它是错误的。为什么这太宽了?应该有一些原因,他们以这种方式实现或它是错误的。这是有意义的。我忽略了行的数量可能很大,这可能会导致表锁定。如果没有更好的答案,我会接受你的。非常感谢。有道理。我忽略了行的数量可能很大,这可能会导致表锁定。如果没有更好的答案,我会接受你的。非常感谢。