SQL insert语句执行了两次

时间:2011-12-02 20:17:04

标签: c# asp.net sql insert sqlcommand

防止用户双击或刷新页面会导致执行SQL插入语句两次的最佳方法是什么,我尝试在单击后禁用该按钮,但结果并不是很好。我期待有可能从代码隐藏中做到这一点。更像是SQL提交和回滚

2 个答案:

答案 0 :(得分:1)

也许PRG wikipedia article可以为您提供帮助:

  

发布/重定向/获取(PRG)是Web开发人员的常见设计模式   帮助避免某些重复的表单提交并允许用户代理   使用书签和刷新按钮更直观地表现。

答案 1 :(得分:1)

如果您希望防范这种情况,您将需要服务器知道当前用户已经开始执行操作,并且在满足条件之前无法再次启动它。

您需要能够在可能访问您网站的众多用户中识别该用户。这最简单地使用SessionState完成,但如果您没有其他需要SessionState并且希望大规模扩展您的应用程序,则可以使用用于标识用户的简单随机cookie作为用于将项目放入其中的任何键的前缀。服务器缓存。

假设您使用了SessionState。你会做类似以下的事情(伪):

public void StartAction()
{
  var inProgress = HttpContext.Current.Session["actionInProgress"] as bool;
  if (!inProgress)
  {
     try
     {
        HttpContext.Current.Session["actionInProgress"] = true;
        MySqlController.DoWork();
     }
     finally
     {
        HttpContext.Current.Session["actionInProgress"] = false;
     }
  }
}

以上内容未考虑以下内容:

  • 捕获例外和/或关闭finally
  • 中的所有连接
  • 由于下次点击您的客户端而排队后续操作(如果操作已在进行中,则此伪代码将返回)
  • 我选择了最简单的解决方案,但实际上更好的做法是将其作为一种异步运行的服务包含在内,以便您可以监控进度,以保证用户的利益,并防止多个并行流程。