首页 文章

网站数据库重复记录

提问于
浏览
0

在我的网站的每个页面上,一个标记作为查询字符串参数传入 . 服务器端代码检查数据库中是否已存在该令牌 . (令牌是数据库中的uniqueidentifider字段) . 如果令牌存在则它将使用现有令牌,否则它将使用新令牌创建新行 .

问题是偶尔我在数据库中看到一个重复的记录(两行具有相同的uniqueidentifider) . 我注意到记录插入时间大约是半秒钟 . 我唯一的猜测是,第一次访问该网站时,aspx页面没有完全编译 . 因此,它需要几秒钟,用户通过键入不同的URL来访问该站点的另一个页面,并且几乎同时执行这两个请求 .

有没有办法防止这种重复记录问题发生? (在服务器端或数据库中......)

这是问题中的代码,它是网站每个页面的一部分 .

var record = (from x in db.Items
             where x.Token == token
             select x).FirstOrDefault();

if (record == null)
{
    var x = new Item();
    x.Id = Guid.NewGuid();
    x.Token = token;
    db.Items.InsertOnSubmit(x)
    db.SubmitChanges;

}

1 回答

  • 0

    是的,在 token 字段上创建 unique index .

    create unique index tab_token on your_table(token);
    

    这样, database 将确保您永远不会存储具有相同 token 值的两条记录 . 请记住,由于 index 约束,您的代码在运行时可能会失败,因此请确保您在代码中捕获该异常并相应地对其进行处理 .

    可能发生的事情是两个请求在同一时间被提供,并且一些竞赛条件导致两个令牌获得相同的值 . 如果您发布一些代码,将有助于确定您的问题 .

相关问题