테이블 행에서 DIBS를 호출합니다
-
22-08-2019 - |
문제
내가 가진 문제는 이것입니다.
다음 필드가있는 테이블 (예제)이 있습니다.
ID int
Value int
alkebyfive ()라는 메소드가 있습니다.
method IncreaseByFive(int ID)
{
int value = GetValueFromDB(ID);
value = value + 5;
SaveValueToDB(value, ID);
}
내가 피하고 싶은 것은 다음과 같은 상황입니다.
- 사용자 A 호출 방법 및 값을 얻습니다 (현재 5)
- 사용자 B 메소드를 호출하고 값을 얻습니다 (현재 5)
- 사용자 A는 가치를 5 (현재 10)로 증가시킵니다.
- 사용자 B는 가치를 5 (현재 10)로 증가시킵니다.
- 사용자 A 저장 값 (10)
- 사용자 B는 값을 저장합니다 (10)
이제 레코드의 값은 15 일 때 값이 10입니다.
내가 강요하고 싶은 것은 다음과 같습니다.
- 사용자 A 호출 방법 및 값을 얻습니다 (현재 5)
- 사용자 B는 메소드를 호출하지만 A가 이미 호출되어 기다려야합니다. (돈!)
- 사용자 A는 값을 증가시킵니다 (현재 10)
- 사용자 B는 여전히 기다리고 있습니다
- 사용자 A는 값을 저장합니다 (레코드는 값이 10입니다)
- 사용자 B는 이제 값 (10)을 읽을 수 있습니다.
- 사용자 B는 값을 증가시킵니다 (15)
- 사용자 B는 값을 저장합니다
이제 레코드의 값은 15인데, 이는 내가 찾고있는 결과입니다.
나는 과거에 정적 클래스를 사용 하여이 문제를 해결하고 해당 클래스의 생성자 내에 생성 된 정적 객체에 잠금을 넣어 하나의 정적 방법을 통해 모든 작업을 퍼뜨립니다. 그러나 이것이 확장 가능하지는 않습니다.
또한 트랜잭션의 최고 분리 수준 (직렬화 가능)은 위의 원치 않는 예의 2 단계에서 읽을 수 있기 때문에 트릭을 수행하지 않을 것이라고 생각합니다.
나는 또 다른 해결책이 내 자신의 잠금 테이블을 만들고 잠금 장치를 녹음하는 것이지만, 그것은 그것이 필요하지 않은 것처럼 보인다.
C# (3.5) 및 SQL Server 2008 로이 프로젝트를 개발하고 있습니다.
벌집의 마음은 어떻게 생각합니까?
해결책
아마도 ~ 위에이것을 생각하면서, 당신은 전체 논리 블록을 랩핑하지 않을 것입니다 ..
- 가치를 읽습니다
- 값을 쓰십시오
데이터베이스 트랜잭션에서 적절한 수준?
SET TRANSACTION ISOLATION LEVEL
{ READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
}
[ ; ]
제휴하지 않습니다 StackOverflow