我设置了一个系统来锁定数据库表中的某些内容,因此一次只能有一个用户编辑该内容。很容易,这部分工作正常。但现在我正处于如何发送“解锁”内容请求的路障中。我有解锁内容的存储过程,但是当用户关闭浏览器时我将如何/在何处调用它?
答案 0 :(得分:5)
您也无法知道用户何时关闭计算机。你必须反过来这样做。
要求定期更新锁定。只有网站才会进行定期续订。如果用户停止使用该网站,则锁定将过期。
否则,要求用户明确解锁内容。其他想要编辑内容的用户可以在第一个用户无法完成工作时对他们大喊大叫。不是技术解决方案,但仍然是一个好的解决方案。羞耻有效。
答案 1 :(得分:1)
您可以做的最好的事情是在global.asax中向Session_End添加一些内容。不幸的是,直到会议结束才会激活。
当用户点击浏览器中的“X”时,无论如何都不能保证浏览器会向您发回任何内容。
答案 2 :(得分:1)
关于Session_End方法的快速说明。如果您使用此方法,则必须确保
该会话状态是InProc,例如。将这样的内容添加到Web.config
< sessionState mode =“InProc”timeout =“timeout_in_minutes”/>
确保在正常操作期间设置IIS以便不回收工作进程(例如参见this blog post)。
修改强> 不直接直接回答问题,但另一种方法是对有问题的数据使用Optimistic concurrency control。
答案 3 :(得分:0)
有“用户关闭浏览器”这样的事件。
尽管如此,我可以想到两个解决方法:
答案 4 :(得分:0)
尝试离开stackoverflow应答页面弹出“你确定”对话框。也许在SO使用的on-page-leave事件期间(或者SO执行此操作),您可以使用XmlHttpRequest对象发送最终请求。这不会涵盖浏览器进程意外关闭(使用session_onend),但它至少会发送“我关闭”事件
答案 5 :(得分:0)
我认为您的一个存储过程可以执行锁定和解锁(与“选择@strNewMax作为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”,具体取决于它是否有效。
也许你可以接受并调整它以适应你的应用。