Дубликаты записей базы данных сайта - PullRequest
0 голосов
/ 19 сентября 2010

На каждой странице моего сайта токен передается как параметр строки запроса.Код на стороне сервера проверяет, существует ли токен в базе данных.(Токен - это поле уникального идентификатора в базе данных).Если токен существует, он будет использовать существующий, если нет, то создаст новую строку с новым токеном.

Проблема заключается в том, что время от времени я вижу дублирующую запись в базе данных (две строкис тем же уникальным идентификатором).Я заметил, что время вставки записи составляло примерно полсекунды.Мое единственное предположение - когда сайт посещают впервые, страницы 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 голосов
/ 19 сентября 2010

Да, создайте уникальный индекс в своем поле token.

create unique index tab_token on your_table(token);

Таким образом, база данных гарантирует, что вы никогда не будете хранить две записис тем же значением token.Имейте в виду, что ваш код может не работать при выполнении этого из-за ограничения index , поэтому убедитесь, что вы перехватываете это исключение в своем коде и обрабатываете его соответствующим образом.

что два запроса обслуживаются в одно и то же время, и из-за некоторых условий гонки два токена получают одинаковое значение.Это поможет определить вашу проблему, если вы напишите какой-нибудь код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...