如何防止多个用户同时将项添加到Sharepoint列表

时间:2011-11-16 08:37:04

标签: algorithm sharepoint mutex

我使用简单的表单让人们注册参加活动。他们的详细信息将保存到Sharepoint列表中。我有一个可以报名参加活动的人(比如100人)。

如何防止第100个和第101个人同时注册,导致配额检查允许第101个人注册(因为第100个人还不在列表中)?

3 个答案:

答案 0 :(得分:2)

ItemAdding代码放在lock statement内,以确保一次只有一个线程可以进入代码的关键部分:

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 :(得分:1)

那么你可以使用事件接收器项添加方法。在项目添加时,您的项目未创建,您可以计算已注册人员的当前计数。如果它大于100则可以取消项目添加。

但可以肯定的是,可以触发多个项目添加方法,以防止您可以计算当前人数并增加计数+1,并将该值保留在其他位置(可能在事件项目上的字段上)和所有项目添加方法都可以在添加项目之前检查该值。

项目添加方法对于这些操作来说太迟了。

这将是我将使用的解决方案。

答案 2 :(得分:0)

我想如果你要更新一个列,让我们说 - “SignUp Count”,那么其中一个用户将得到Save Conflict问题。第一次更新值的人获胜,第二次失败。

此致 Nitin Rastogi