C# Sql Server并发性和唯一约束
我有一张如下的桌子C# Sql Server并发性和唯一约束,c#,sql-server,multithreading,entity-framework,concurrency,C#,Sql Server,Multithreading,Entity Framework,Concurrency,我有一张如下的桌子 AssetResource -- AssetResourceId AssetId ResourceNumber ResourceType TrackNumber ChapterNumber 我已在(AssetId、ResourceNumber、ResourceType)上设置了唯一约束。 资源编号应为每个AssetId和ResourceType的唯一序列号 此表由多个进程(相同的代码库)同时更新。或同时为同一AssetId和ResourceType添加行 我总是在Resou
AssetResource
--
AssetResourceId
AssetId
ResourceNumber
ResourceType
TrackNumber
ChapterNumber
我已在(AssetId、ResourceNumber、ResourceType)上设置了唯一约束。
资源编号应为每个AssetId和ResourceType的唯一序列号
此表由多个进程(相同的代码库)同时更新。或同时为同一AssetId和ResourceType添加行
我总是在ResourceNumber上得到唯一键约束异常。
所以我所做的是,当一个进程添加/更新一行时,我随机创建一个大的资源号(期望随机数是唯一的),如下所示
但我仍然得到了唯一的约束例外。所以我决定让我的服务继续尝试,直到生成一个唯一的随机数。我还创建了另一个服务(单线程)来验证资源号,并用正确的序列号更新表
然而,当新服务正在更新此表时,该表有可能被具有随机资源号的原始多线程进程更新。所以我跑进了一个圈子,事情变得一团糟
有没有简单的方法解决这个问题
艾伦-< /P>如果两个进程完全同时运行,则强迫两个进程初始化具有相同种子值的<代码>随机< /代码>,因此它们都将产生相同的随机数。您会考虑使用这些密钥的自动增量而不是手动处理吗?有没有办法创建一个真正的随机数?@Alex没有,我们不能这样做,因为资源数是基于这个字段的一些逻辑公式?如果两个进程同时运行,你强迫他们都用相同的种子值来初始化<代码>随机< /代码>,所以它们都会产生相同的随机数。你会考虑使用这些密钥的自动增量而不是手动处理吗?@达米恩·亚历克斯,有没有办法创造一个真正的随机数?“不,我们不能这样做,因为资源编号基于某些逻辑,所以该字段有任何公式吗?
var randomResourceNumber = new Random((int)DateTime.Now.Ticks).Next(1000, 100000);