私はシーケンシャルIDを追跡する必要があります。これは、4つのテーブルにわたってmax(id)を実行しているSPを介して私に返されています。シーケンスを管理しているデータベースにはidentifer/sequenceはありません。これは明らかに並行性の問題があるので、私は一意のIDが常に生成されるようにヘルパークラスを作成しました。以下のヘルパークラスは安全ですか?
ヘルパーは、最初に現在のIdを見つけるためにDBを呼び出すリポジトリを介して初期化され、その後のすべてのID要求はヘルパー経由でメモリ内で処理されます。 DB(鉱山)を使用しているアプリは1つしかないので、他の誰かが来て、トランザクションを作成することについて心配する必要はありません。& Idの同期が外れています。私は、IVEは、スレッド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