문제

내가 가진 문제는 이것입니다.

다음 필드가있는 테이블 (예제)이 있습니다.

ID int
Value int

alkebyfive ()라는 메소드가 있습니다.

method IncreaseByFive(int ID)
{    
    int value = GetValueFromDB(ID);
    value = value + 5;
    SaveValueToDB(value, ID);    
}

내가 피하고 싶은 것은 다음과 같은 상황입니다.

  1. 사용자 A 호출 방법 및 값을 얻습니다 (현재 5)
  2. 사용자 B 메소드를 호출하고 값을 얻습니다 (현재 5)
  3. 사용자 A는 가치를 5 (현재 10)로 증가시킵니다.
  4. 사용자 B는 가치를 5 (현재 10)로 증가시킵니다.
  5. 사용자 A 저장 값 (10)
  6. 사용자 B는 값을 저장합니다 (10)

이제 레코드의 값은 15 일 때 값이 10입니다.

내가 강요하고 싶은 것은 다음과 같습니다.

  1. 사용자 A 호출 방법 및 값을 얻습니다 (현재 5)
  2. 사용자 B는 메소드를 호출하지만 A가 이미 호출되어 기다려야합니다. (돈!)
  3. 사용자 A는 값을 증가시킵니다 (현재 10)
  4. 사용자 B는 여전히 기다리고 있습니다
  5. 사용자 A는 값을 저장합니다 (레코드는 값이 10입니다)
  6. 사용자 B는 이제 값 (10)을 읽을 수 있습니다.
  7. 사용자 B는 값을 증가시킵니다 (15)
  8. 사용자 B는 값을 저장합니다

이제 레코드의 값은 15인데, 이는 내가 찾고있는 결과입니다.

나는 과거에 정적 클래스를 사용 하여이 문제를 해결하고 해당 클래스의 생성자 내에 생성 된 정적 객체에 잠금을 넣어 하나의 정적 방법을 통해 모든 작업을 퍼뜨립니다. 그러나 이것이 확장 가능하지는 않습니다.

또한 트랜잭션의 최고 분리 수준 (직렬화 가능)은 위의 원치 않는 예의 2 단계에서 읽을 수 있기 때문에 트릭을 수행하지 않을 것이라고 생각합니다.

나는 또 다른 해결책이 내 자신의 잠금 테이블을 만들고 잠금 장치를 녹음하는 것이지만, 그것은 그것이 필요하지 않은 것처럼 보인다.

C# (3.5) 및 SQL Server 2008 로이 프로젝트를 개발하고 있습니다.

벌집의 마음은 어떻게 생각합니까?

도움이 되었습니까?

해결책

아마도 ~ 위에이것을 생각하면서, 당신은 전체 논리 블록을 랩핑하지 않을 것입니다 ..

  • 가치를 읽습니다
  • 값을 쓰십시오

데이터베이스 트랜잭션에서 적절한 수준?

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }
[ ; ]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top