2011-11-16 7 views
2

간단한 양식을 사용하여 사람들이 이벤트에 등록 할 수 있도록하고 있습니다. 세부 정보는 Sharepoint 목록에 저장됩니다. 나는 행사에 등록 할 수있는 사람들의 할당량을 가지고있다 (100 명을 말한다).여러 사용자가 동시에 Sharepoint 목록에 항목을 추가하는 것을 방지하는 방법

100 번째 및 101 번째 사람이 동시에 가입하는 것을 방지하여 100 번째 사람이 아직 목록에 없으므로 101 번째 사람이 등록 할 수 있도록 할당량 확인을 유발할 수 있습니까?

+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"라고 말하면 사용자 중 한 명이 충돌 해결 문제가 발생합니다. 처음으로 가치를 갱신 한 사람은 누구나 이기고 두 번째 것은 실패 할 것입니다.

감사합니다, 니틴 Rastogi

2

놓습니다 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와 동일한 연결이 사용됩니까?

+1

여러 WFE가있는 팜에서이 작업이 반드시 작동하는 것은 아닙니다. (이 경우 상당히 많은 임시 상황을 이야기하고 있습니다. 티켓 마스터 나 일부 대용량 사이트를 실행하지 않기를 바랍니다.) – Ryan

+0

@Ryan 왜 OP가 항목 추가 *의 동시성을 두려워하는지 잘 모르겠다. 사용자는 무엇을하고 있습니까? 서로 옆에 앉아 카운트 다운? * 3 ... 2 ... 1 ... click! *이 경우에도 여전히이 문제는 발생하지 않는다고 생각합니다. –

+0

확실하지는 않지만 (그러므로 +1), 어쨌든 언급해야한다고 생각했습니다. – Ryan

관련 문제