网站数据库重复记录

时间:2010-09-18 20:02:36

标签: c# asp.net-mvc linq linq-to-sql

在我网站的每个页面上,一个令牌作为查询字符串参数传入。服务器端代码检查数据库中是否已存在该令牌。 (令牌是数据库中的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 :(得分:0)

是的,在token字段上创建唯一索引

create unique index tab_token on your_table(token);

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

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