Как запретить нескольким пользователям добавлять элемент в список Sharepoint одновременно - PullRequest
2 голосов
/ 16 ноября 2011

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

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

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Поместите код 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 будет использоваться?

1 голос
/ 16 ноября 2011

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

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

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

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

0 голосов
/ 16 ноября 2011

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

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

...