Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sql Server并发性和唯一约束_C#_Sql Server_Multithreading_Entity Framework_Concurrency - Fatal编程技术网

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);