我正在使用一种简单的表单来允许用户注册一个事件。他们的详细信息保存到Sharepoint列表。我有一个可以报名参加活动的人(例如100人)。如何防止多个用户同时向Sharepoint列表添加项目
如何防止第100位和第101位的人同时注册,导致配额检查允许第101位的人注册(因为第100位的人尚未在名单中)?
我正在使用一种简单的表单来允许用户注册一个事件。他们的详细信息保存到Sharepoint列表。我有一个可以报名参加活动的人(例如100人)。如何防止多个用户同时向Sharepoint列表添加项目
如何防止第100位和第101位的人同时注册,导致配额检查允许第101位的人注册(因为第100位的人尚未在名单中)?
那么你可以使用事件接收器项目添加方法。在项目添加时,您的项目不会创建,您可以计算注册人员的当前计数。如果它大于100,则可以取消项目添加。
但肯定的是,可以触发多个项目添加方法,以防止您可以计算当前的人数并增加计数+1,并将该值保存在其他位置(可能位于事件项目的某个字段上)并且所有项目添加方法都可以在添加项目之前检查该值。
项目添加方法对于这些操作来说太晚了。
这将是我会使用的解决方案。
我想如果你正在更新一个专栏,可以说 - “SignUp Count”,那么其中一个用户会得到Save Conflict问题。第一次更新价值的人赢,第二次失败。
问候, 尼廷Rastogi
放置一个lock
statement内ItemAdding
代码,以确保只有一次一个线程可以进入代码的关键部分:
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个人还没有在列表中*和*添加项目的并发性*?人100在11:54:00开始处理并在11:54:49提交表单; 101:11:54:30并在11:54:48提交表格;谁应该注册? –
人101应该可以注册。人100应该收到通知。 – TanyaB
你实际上遇到了这个问题吗?你不试图过早地解决一个不存在的问题吗?试图同时注册一个活动的最大用户数量是多少? –