我使用简单的表单让人们注册参加活动。他们的详细信息将保存到Sharepoint列表中。我有一个可以报名参加活动的人(比如100人)。
如何防止第100个和第101个人同时注册,导致配额检查允许第101个人注册(因为第100个人还不在列表中)?
答案 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