DB オブジェクトにロードされる一連の DB エンティティがあります。同じ DB エンティティが複数の DB オブジェクトにロードされる場合があります。定期的に、DB エンティティには特別な処理が必要になります。この処理は、一度に 1 つのスレッドで実行する必要があります。ここでロックがかかります。
編集: 重要な注意: プロセスは低速の Web サービスを呼び出します。これは、同時実行を防止しようとしているものです。ロックなしでこれを安全に行う方法がわかりません。
そこで、DB オブジェクトがロックのために参照する「南京錠」オブジェクトを作成します。南京錠オブジェクトはエンティティ ベースであるため、同じエンティティの 2 つ以上の DB オブジェクトが同じ南京錠オブジェクトを使用します。DB エンティティの ID をキーとして使用して、これらの南京錠をディクショナリ オブジェクトに格納しています。南京錠オブジェクトも単純な文字列オブジェクトです。これは正しいアプローチですか?私は、これをエンジニアリングまたは単純化していると考えています。アプローチが正しければ、このコードはどのように見えるでしょうか? 動作しますが、まだ負荷をかけた状態でテストしていません。
ありがとう :)
public static func(CustomObject o)
{
if (ReadyForUpdate(o))
{
lock (LookupPadLockByID(object.ID)
{
if (ReadyForUpdate(o))
{
PerformUpdate(object);
}
}
}
}
private static readonly object padlockLock = new object();
private static readonly Dictionary<int, string> padLocks = new Dictionary<int,string>();
private static object LookupPadLockByID(int uniqueID)
{
lock (padlockLock)
{
if (!padLocks.ContainsKey(uniqueID))
{
padLocks.Add(uniqueID, uniqueID + " is locked");
}
}
return padLocks[uniqueID];
}