我有一堆加载到数据库对象中的数据库实体。同一个 DB 实体可能被加载到多个 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];
}