2010-02-26 2 views
1

У меня есть таблица с статистикой попадания некоторых предметов в другой таблице.Сохранить новую или обновить с помощью LinqToSql, транзакций?

Эта таблица определяется как этот

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

Давать меня есть запись пр. item pr day.

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

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

ответ

1

Один из способов справиться с этим - по индексу, создаваемому на 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 
2

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

EDIT: замок может быть установлен как:

public static object _lock = new object(); 

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

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

HTH.

+0

Я не являюсь экспертом в объектах синхронизации SQL Server или .NET, но под «блокировкой» вы подразумеваете нечто вроде Mutex, который будет работать внутри приложения .Net? – Karsten

+0

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

Смежные вопросы