我需要跟蹤順序標識,這是通過SP在4個表中執行max(id)的操作返回給我的,在管理順序的db中沒有標識符/順序。這顯然會產生併發問題,所以我創建了一個輔助類來確保始終生成唯一的Id。以下幫助程序類線程安全嗎?
幫助程序通過其存儲庫進行初始化,該存儲庫最初調用數據庫以查找當前Id,隨後通過幫助程序在內存中爲後續的Id請求提供服務。將只有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'。而使用相同的命名方案也會有所幫助。 –
對於剩餘字段,我使用Pascal大小寫來表示只讀/常量和_Camel大小寫的字段。只有一個存儲庫使用類 – Tom