와의 라인을 따라 뭔가 않는 응용 프로그램 고려 "삽입은하지 않을 경우 존재"NHibernate에
var user = session.QueryOver<User>().Where(x => x.Name==name).SingleOrDefault();
if (user == null)
{
user = new User(name);
session.Save(user);
}
비즈니스 규칙은 사용자의 이름은 고유해야한다는, 그리고이은에 UNIQUE INDEX
에 의해 백업됩니다 데이터 베이스. 위의 코드는 두 명의 사용자가 같은 이름을 사용하여 동시에 등록하려고 시도 할 때까지 잘 작동합니다. 둘 다 user == null
이되고 새 번호는 User
입니다. 커밋 할 첫 번째 명령은 성공하고 두 번째 명령은 데이터베이스에서 발생한 예외와 함께 실패합니다.
이러한 경쟁 조건을 피하는 한 가지 방법은 lock { }
블록에 중요한 코드를 래핑하는 것이지만 응용 프로그램의 여러 인스턴스가 동일한 데이터베이스에 대해 작동 할 때 도움이되지 않습니다. 자, RDBS (이 경우 MS SQL)의 잠금 메커니즘을 사용할 수만 있다면 ...
이것은 내가 갇혀있는 곳입니다. NHibernate 문서에서 읽을 수있는 것부터, 명시 적 잠금을 요청하는 내 QueryOver()
체인에 힌트를 추가하여 해결할 수 있습니다. 나는 아직 실제 행이 없기 때문에 테이블 잠금이어야한다. 이것이 가능한가? How
또는 트랜잭션의 격리 수준을 높이고 필요한 잠금을 자동으로 얻을 수 있습니까? 동일한 작업 단위 내에서 다른 (문제가 아닌) 쿼리가 수행되었다는 것을 고려할 때, 나는 이러한 종류의 변경이 많은 차단/대기를 유발할 수 있다고 생각합니다. 그래?
이 질문에 대한 복제본을 찾은 것일 수 있습니다 : [NHibernate transaction and race condition] (0120-13992/nhibernate-transaction-and-race-condition) –