How to prevent multiple users from adding an item to a Sharepoint list simultaneously

六月ゝ 毕业季﹏ 提交于 2019-12-11 04:03:06

问题


I am using a simple form to allow people to sign up for an event. Their details are saved to a Sharepoint list. I have a quota of people who can sign up for an event (say 100 people).

How can I prevent the 100th and the 101st person from signing up concurrently, causing the quota check to allow the 101st person to sign up (because the 100th person isn't in the list yet)?


回答1:


Place the ItemAdding code inside a lock statement to make sure that only one thread at a time can enter the critical section of code:

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
    }
}

I came up with this idea of a solution for a farm with multiple WFEs - a shared resource (a row in a table in pseudo-code above) gets locked during the time the item is added to the list:

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
    }
}

I left the lock statement because I'm not sure what will happen if the same front-end server tries to add the item #100 and #101 - will the transaction lock the row or will it not because the same connection to SQL Server will be used?




回答2:


So then you can use event receivers item adding method. at item adding, your item is not created, you can calculate the current count of signed up people. if it is bigger then 100 you can cancel item adding.

but sure, more than one item adding method can be fired, to prevent that you can calculate the current count of people and increase the count +1, and keep that value somewhere else (on a field on event item perhaps) and all item adding methods can check that value before adding the item.

item added method is too late for these operations.

this would be the solution i would use.




回答3:


I guess if you are updating a column, lets say - "SignUp Count", then one of the users will get the Save Conflict issue. Whoever updated the value for the first time wins and the second one will fail.

Regards, Nitin Rastogi



来源:https://stackoverflow.com/questions/8148771/how-to-prevent-multiple-users-from-adding-an-item-to-a-sharepoint-list-simultane

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!