Как запретить нескольким пользователям добавлять элемент в список Sharepoint одновременно

Я использую простую форму, чтобы позволить людям подписаться на событие. Их данные сохраняются в списке Sharepoint. У меня есть квота людей, которые могут подписаться на событие (скажем, 100 человек).

Как я могу предотвратить одновременную регистрацию 100-го и 101-го человека, в результате чего проверка квоты позволяет 101-му человеку зарегистрироваться (поскольку 100-го человека еще нет в списке)?

3 ответа

Поместите 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?

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

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

Метод добавления элемента слишком поздний для этих операций.

это было бы решением, которое я бы использовал.

Я полагаю, что если вы обновляете столбец, скажем, "SignUp Count", то один из пользователей получит проблему "Сохранить конфликт". Тот, кто обновил значение в первый раз, побеждает, а второй провалится.

С уважением, Нитин Растоги

Другие вопросы по тегам