Сохранить новый или обновить с LinqToSql, транзакции? - PullRequest
1 голос
/ 26 февраля 2010

У меня есть таблица со статистикой попаданий для некоторых предметов в другой таблице.

Эта таблица определена так

ID (Primary key)
ItemId (Foreign key)
Date
Hits

Дай мне записку пр. пункт pr день.

База данных используется в многопоточной среде, поэтому два пользователя могут сделать первый удар одновременно, что приведет к созданию двух записей, где я хочу только 1 с попаданиями = 2. (из-за уникального индекса вместо этого я бы получил исключение)

Как мне обеспечить, чтобы у меня была только одна запись? пункт pr. день?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Уникальные индексы будут работать. Это позволило бы только одну запись. В качестве альтернативы вы можете установить в коде блокировку, проверить наличие записи с этим идентификатором, если запись существует, избежать вставки и уведомить пользователей о проблеме. Но если ноль, тогда вы продолжаете вставку.

РЕДАКТИРОВАТЬ: блокировка может быть настроена как:

public static object _lock = new object();

public void Save(..)
{
   lock(_lock) {
      //check for existence of an ID
      //process accordingly
   }
}

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

НТН.

1 голос
/ 26 февраля 2010

Одним из способов справиться с этим является индекс, который вы создаете в SQL Server.С помощью SQL Server вы можете создать уникальный индекс, но вместо того, чтобы вызывать исключение при попытке добавить дубликат, он просто игнорирует дубликат.Чтобы сделать это, убедитесь, что типом индекса является «Индекс» и установите «Игнорировать повторяющиеся ключи» на «Да»

CREATE UNIQUE NONCLUSTERED INDEX IX_MyIndex ON MyTable
(
   MyColumn
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...