2011-11-16 65 views
2

我正在使用一种简单的表单来允许用户注册一个事件。他们的详细信息保存到Sharepoint列表。我有一个可以报名参加活动的人(例如100人)。如何防止多个用户同时向Sharepoint列表添加项目

如何防止第100位和第101位的人同时注册,导致配额检查允许第101位的人注册(因为第100位的人尚未在名单中)?

+0

你是什么意思*,因为第100个人还没有在列表中*和*添加项目的并发性*?人100在11:54:00开始处理并在11:54:49提交表单; 101:11:54:30并在11:54:48提交表格;谁应该注册? –

+0

人101应该可以注册。人100应该收到通知。 – TanyaB

+1

你实际上遇到了这个问题吗?你不试图过早地解决一个不存在的问题吗?试图同时注册一个活动的最大用户数量是多少? –

回答

1

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

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

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

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

+0

问题在于,当两个不同的人同时尝试注册时,会同时触发项目添加。对于他们两人来说,人数是99人,他们都能够报名。 – TanyaB

+1

这就是为什么我说保持计数值在别的地方,你会匹配项目的计数和你在其他地方举行的价值。它不可能是同时的,因为毫秒和用这种方法甚至几个毫秒可以节省您的时间。 – megusta

0

我想如果你正在更新一个专栏,可以说 - “SignUp Count”,那么其中一个用户会得到Save Conflict问题。第一次更新价值的人赢,第二次失败。

问候, 尼廷Rastogi

2

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

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

这不一定适用于拥有多个WFE的农场(你在谈论一个相当特殊的环境来实现这个目标,但是希望他们没有经营售票员或者一些超大容量的网站!) – Ryan

+0

@Ryan我是不知道为什么OP对添加项目*的并发性如此害怕。用户在做什么?坐在一起并倒计时? * 3 ... 2 ... 1 ...点击!*即使他们这样做,我仍然认为这个问题是不可能的。 –

+0

肯定它不太可能(因此+1),但我想我应该提及它。 – Ryan

相关问题