Поместите код ItemAdding
в оператор lock
, чтобы убедиться, что только один поток одновременно может вводить критическую часть кода:
private Object _lock = new Object();
public override void ItemAdding(SPItemEventProperties properties)
{
lock(_lock)
{
// check number of the list items and cancel the event if necessary
}
}
Мне пришла в голову идея решения для фермы с несколькими WFE - общий ресурс (строка в таблице в псевдокоде выше) блокируется во время добавления элемента в список:
private Object _lock = new Object();
public override void ItemAdding(SPItemEventProperties properties)
{
try
{
// 1. begin a SQL Server transaction
// 2. UPDATE dbo.SEMAPHORE
// SET STATUS = 'Busy'
// WHERE PROCESS = 'EventSignup'
lock(_lock)
{
// 3. check number of the list items and cancel the event if necessary
}
}
finally
{
// 4. UPDATE dbo.SEMAPHORE
// SET STATUS = ''
// WHERE PROCESS = 'EventSignup'
// 5. commit a SQL Server transaction
}
}
Я оставил оператор lock
, потому что я не уверен, что произойдет, если один и тот же интерфейсный сервер попытается добавить элемент # 100 и # 101 - заблокирует ли транзакция строку или нет, потому чтотакое же подключение к SQL Server будет использоваться?