순차적 ID를 추적 할 필요가 있습니다. 이것은 4 개의 테이블에서 최대 (ID)를 수행하는 SP를 통해 나에게 반환됩니다. 시퀀스를 관리하는 db에는 식별자/시퀀스가 없습니다. 분명히 동시성 문제가 생길 것이므로 고유 ID가 항상 생성되도록 도우미 클래스를 만들었습니다.다음 도우미 클래스가 안전합니까?
도우미는 처음에는 현재 ID를 찾기 위해 DB를 호출하는 저장소를 통해 초기화되며 ID에 대한 모든 후속 요청은 도우미를 통해 메모리에서 제공됩니다. DB (광산)를 사용하는 앱이 1 개만 있으므로 누구도 따라 오지 않고 거래를 생성 할 필요가 없습니다. & ID가 동기화되지 않습니다. 나는 필자 스레드 saftey의 기초를 가지고 생각하지만, 누군가가 알려 주시기 바랍니다 수 :
private class TransactionIdProvider
{
private static readonly object Accesslock = new object();
private int _transactionId;
public int NextId
{
get
{
lock (Accesslock)
{
if(!Initialised) throw new Exception("Must Initialise with id first!!");
return _transactionId++;
}
}
}
public bool Initialised { get; private set; }
public void SetId(int id)
{
lock (Accesslock)
{
if (Initialised) return;
_transactionId = id;
Initialised = true;
}
}
public TransactionIdProvider()
{
Initialised = false;
}
}
도우미 클래스가 저장소에 초기화되어, 도우미가 초기화 경쟁 조건에 대해 걱정 메신저 :
private static readonly TransactionIdProvider IdProvider = new TransactionIdProvider();
public int GetNextTransactionId()
{
if(!IdProvider.Initialised)
{
// Ask the DB
int? id = _context.GetNextTransactionId().First();
if (!id.HasValue)
throw new Exception("No transaction Id returned");
IdProvider.SetId(id.Value);
}
return IdProvider.NextId;
}
이를 사용하여 둘 이상의 저장소가 그래서 좋은 프라그와 그 경고를 무시 ? – driis
'_transactionId'가 아닌 경우'AccessLock'을'static'으로 선언하지 마십시오. 동일한 명명 체계를 사용하면 도움이됩니다. –
나는 파스칼 케이스를 읽기 전용/상수 필드와 나머지 필드 용 _Camel 케이스로 사용합니다. 코드가 훨씬 더 간결하고 읽기 쉽기 때문에 오직 하나의 저장소 만이 클래스 – Tom