나는 동일한 문제가 있었지만 C#으로 해결했습니다.
내가 테이블에 매핑 된 엔티티가 있어야합니다 종류에 따라 사용 된 마지막 번호를 저장하는
이
public class MyEntity
{
Kind IdKind{get; set;}
int Number{get;set;}
}
내가해야 및 보조 기관을.
public class LastNumber
{
Kind IdKind{get;set;}
int LastNumber{get;set;}
}
그 다음 테이블의 행 (MyEntity 객체)를 추가하기 전에, I 종류와 LastNumberEntity LastNumber의 필드를 사용하여 적절한 수를 계산한다 내 종류 값과 같다.
두 개의 서로 다른 스레드가 같은 종류의 개체를 동시에 추가 할 수 있으므로이 스레드는 동시성 문제가 있음을 알아야합니다. 스레드는 동일한 LastNumberEntity를 검사하여 LastNumber 값을 가져옵니다. 이 문제는 엔티티 프레임 워크에서 알려진 해결책이 있습니다. 이 코드는 수는 다음과 같습니다
public int GetNumber(Kind idKind)
{
using (var db = new MyDataContext())
{
var lastNumber = db.LastNumbers.Single(x=>x.IdKind == idKind);
for (int attemps = 0; attemps < 10;)
{
try
{
lastNumber.LastNumber++;
db.SaveChanges();
return lastNumber.LastNumber;
}
catch (DbUpdateConcurrencyException ex)
{
attemps++;
}
}
}
throw new Exception("Many concurrency calls");
}
이 방법은 특정 종류의 증가 수를 얻고이를 사용하여 동시성 문제를 처리, 우리는 각 MyEntity 개체의 숫자 값을 설정할 수 있습니다.클라이언트 코드는 수 다음과 같습니다
var entity = new MyEntity();
var number = GetNumber(entity.IdKind);
entity.Number = number;
db.MyEntities.Add(entity);
db.SaveChanges();
이 코드는 항상 GetNumber 방법을 사용하여 DB를 관리하는 저장소를 사용하여 생성 된 엔티티를 보장하기 위해 공장을 만드는 세터 개인 만들기, 리팩토링 할 수있다.