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