Asp.net 当用户离开网站(ASPX)时,是否对数据库进行最后一次调用?

Asp.net 当用户离开网站(ASPX)时,是否对数据库进行最后一次调用?,asp.net,database,tsql,global,Asp.net,Database,Tsql,Global,我设置了一个系统来锁定数据库表中的某些内容,这样一次只有一个用户可以编辑这些内容。很简单,那部分很好用。但现在我遇到了如何发送请求“解锁”内容的障碍。我有用于解锁内容的存储过程,但是当用户刚刚关闭浏览器时,我将如何/在何处调用它?您也不知道用户何时关闭计算机。你必须反过来做 要求定期更换锁。只有网站会定期更新。如果用户停止使用网站,则锁定过期 否则,要求用户显式解锁内容。其他想要编辑内容的用户可以在第一个用户无法完成工作时对其大喊大叫。这不是一个技术解决方案,但仍然是一个很好的解决方案。羞耻是有

我设置了一个系统来锁定数据库表中的某些内容,这样一次只有一个用户可以编辑这些内容。很简单,那部分很好用。但现在我遇到了如何发送请求“解锁”内容的障碍。我有用于解锁内容的存储过程,但是当用户刚刚关闭浏览器时,我将如何/在何处调用它?

您也不知道用户何时关闭计算机。你必须反过来做

要求定期更换锁。只有网站会定期更新。如果用户停止使用网站,则锁定过期


否则,要求用户显式解锁内容。其他想要编辑内容的用户可以在第一个用户无法完成工作时对其大喊大叫。这不是一个技术解决方案,但仍然是一个很好的解决方案。羞耻是有效的。

你真正能做的最好的事情就是在你的global.asax中为你的会话添加一些东西。不幸的是,在会话超时之前,这不会触发

当用户在浏览器中单击“X”时,无法保证浏览器会将任何内容发送回您。

存在“用户关闭浏览器”之类的事件

不过,我可以想出两个变通办法:

  • 使用Javascript/Ajax永久地 (假设每10秒)呼叫一个 方法。日期时间 需要存储上一个查询 某处。现在你可以写一个windows 每秒检查一次的服务 哪些会话已超时。表演 您的自定义操作
  • 使用global.asax会话_End() -事件。(不能与每个会话状态一起使用,请查找哪个会话状态 它是可用的)

试图离开stackoverflow回答页面时,会弹出一个“确定”对话框。也许在SO使用的on page leave事件期间(或者无论如何如此),您可以使用XmlHttpRequest对象发送最终请求。如果浏览器进程意外关闭(请使用session_oned),则这不包括在内,但它至少会在较早时发送“I'm closed”(我已关闭)事件,并在会话结束时发送一个快速说明。如果使用此方法,则必须确保

  • 该会话状态为InProc,例如,在Web.config中添加类似的内容

  • 确保已将IIS设置为在正常操作期间不回收工作进程(请参阅示例)

  • 编辑:
    不直接回答问题,但另一种方法是对所讨论的数据使用。

    我认为您的一个存储过程可以执行锁定和解锁(与“Select@strNewMax As NewMax”一起使用)

    以下是我拥有的一个系统的示例:

    Declare @strNewMax Char
    Select @strNewMax = 'N'
    
    BEGIN TRANSACTION
    
    /* Lock only the rows for this Item ID, and hold those locks throughout the transaction. */
    If @BidAmount > (Select Max(AB_Bid_AMT) from AuctionBid With(updlock, holdlock) Where AB_AI_ID = @AuctionItemId)
    Begin
        Insert Into AuctionBid (AB_AI_ID, AB_Bid_AMT, AB_Emp_ID, AB_Entry_DTM)
        Select @AuctionItemId, @BidAmount, @EmployeeId, GetDate()
        Select @strNewMax = 'Y'
    End
    
    COMMIT TRANSACTION
    
    Select @strNewMax As NewMax
    
    这将插入一条记录作为下一个最高出价,同时锁定整个表,因此不会同时处理其他出价。它将返回“Y”或“N”,具体取决于它是否工作


    也许你可以拿着这个,调整它以适应你的应用。

    嗯。我担心这就是答案。我并不担心,但用户的平均智商似乎低于70:(@Jisaak:就像我说的,羞耻是有效的。让他们在下次会议前站起来说他们是如何阻止其他人的工作的。哈哈,我想我会开一个钱罐。所以每次有人忘记打开钱罐,他们就得在我的钱罐里放一美元。没有什么比免费餐更重要的了:)@Jisaak:事实上,我相信有人对此进行了研究,但我打赌钱罐的效果不如同事的反对。但不管怎样,当用户超时时,会话结束最终仍会被调用,对吗?对,除非有其他东西停止整个IIS进程本身。噢,该死。谢谢提醒。实施到此为止使用快速锁定功能并度过一个愉快的周末。没问题。我被2.我自己和我不想让它发生在任何人身上:)我不想依赖任何类型的客户端“用户关闭浏览器”事件来处理任何影响服务器或其他用户的事情。