刷新页面重复数据库事务

本文关键字:数据库 事务 刷新 | 更新日期: 2023-09-27 18:30:27

我有超过 30 个 aspx 页面,我最近发现了一个问题,如果我执行任何类型的数据库事务,如插入、更新、删除,然后在事务完成后我按 F5 或刷新页面,无论如何都会发生相同的事务。

寻找了一个解决方案,但我能找到的只是我必须检查每个按钮上的视图状态,这是不可能的,因为这意味着会有很多工作。必须有通用的解决方案,请帮助我解决这个问题。

编辑:

以下是其中一个按钮上的代码,该按钮将数据库中的值更改为 true 或 false:

 protected void btn_Publish_Click(object sender, EventArgs e)
{
    if (Convert.ToBoolean(int.Parse(hf_Published.Value.ToString())))
    {
        publish(false);
    }
    else
    {
        publish(true);
    }
}
执行代码

后,如果刷新页面,则执行相同的代码,我注意到由于在此方法上放置了一个断点。

刷新页面重复数据库事务

你可以

试试这个。我在几个项目中使用了它并成功工作。

 public bool IsRefreshed
    {
        get
        {
            if (Convert.ToString(Session["RefreshTimeStamp"]) == Convert.ToString(ViewState["RefreshTimeStamp"]))
            {
                Session["RefreshTimeStamp"] = HttpContext.Current.Server.UrlDecode(System.DateTime.Now.ToString());
                return false;
            }
            else
            {
                return true;
            }
        }
    }


protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        ViewState["RefreshTimeStamp"] = Session["RefreshTimeStamp"];
    }

protected override void OnLoad(EventArgs e)
    {  
        if (!Page.IsPostBack)
        {
            Session["RefreshTimeStamp"] = HttpContext.Current.Server.UrlDecode(System.DateTime.Now.ToString());
        }
        base.OnLoad(e);
    }

有一个通用的解决方案,被成千上万的开发人员使用多年。

解决方案是:每次在服务器上执行侵入性进程(插入/更新/删除)时,您不仅要渲染页面,还要将带有 302 的响应重定向到带有"您的事务成功"消息的新页面。

这样,按 F5 将只刷新此消息页面,而不是触发事务的原始页面。

这是否直接适用于你的方案取决于您。

http://en.wikipedia.org/wiki/Post/Redirect/Get

要解决此问题,您可以检查以下内容:

  1. 必要时禁用提交按钮
  2. 向代码添加一些验证并检查重复条目
  3. 提交后将用户重定向到另一个页面

除非是真正的"交易",如付款等(其他人已经解释过,重定向等),
您还可以尝试在与 Db 交互或作为应用瓶颈的页面上定义缓存
如果你想一直拥有实时信息(它是那种"活着"类型的应用程序),那么这个解决方案就没有运气了(但即便如此),但通常,你可以把一些合理的时间到期时间放在你希望你的数据的"新鲜"程度上。
缓存 ASP.NET 页面