在我网站的每个页面上,一个令牌作为查询字符串参数传入。服务器端代码检查数据库中是否已存在该令牌。 (令牌是数据库中的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;
}
答案 0 :(得分:0)
是的,在token
字段上创建唯一索引。
create unique index tab_token on your_table(token);
这样,数据库将确保您永远不会存储具有相同token
值的两条记录。请记住,由于索引约束,您的代码在运行时可能会失败,因此请确保您在代码中捕获该异常并相应地对其进行处理。
可能发生的事情是两个请求在同一时间提供,一些竞争条件导致两个令牌获得相同的值。如果您发布一些代码,将有助于确定您的问题。