0

我有这张桌子:

Mytable(ID, IDGroupReference, Model ...)

我在 MyTable 中有很多记录。属于一个组,因此属于同一组的所有记录具有相同的 IDGroupReference。IDGroup 引用是属于该组的记录之一的 ID。所以一个组的所有记录都具有相同的 IDGroupReference,我可以通过一次查询获得该组的所有记录:

select * from MyTable where IDGroupReference = 12345;

我可以将一个记录从一组更改为另一组,在这种情况下,我也想更改该组的所有记录。我的意思是,我想将两个组合二为一。

在这种情况下,我可以使用这个查询:

Update Mytable set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

我将组 2 的 IDGroupReference 设置为组 1 的 IDGroupReference。

我的疑问是并发性,当两个用户尝试更改两个不同记录的组时。想象一下,我的组 1 有 10.000 条记录和两个用户。用户 1 尝试将组 1 的记录 A 更改为组 2,用户 2 尝试将记录 B 从组 1 更改为组 3。

该组有多少记录,10.000,我认为当我尝试使用我上面描述的查询更新 IDGroupReference 时,SQL Server 会一一更新,以及有多少记录,有可能某些记录在组中b 和其他记录都在组 3 中,当所有的必须在同一个组中时,在组 2 或 3 中,取决于哪个用户是最后更新的。但所有记录必须在同一个组中,而不是拆分。

那么,当我使用更新时,它是如何工作的?是一个事务,没有人可以更新任何将受到影响的记录,或者第二个用户可以在第一个用户的更新过程中更新记录?

我是说:

第 1 组有 10 条记录。用户一执行更新。所以步骤是:

  • SQL Server 更新记录 1。
  • SQL Server 更新记录 2

同时,第二个用户执行查询。

有可能第二个用户更新记录 3 之前是由第一个用户的查询更新的吗?因为如果发生这种情况,那么第 1 组将分成两组,一些记录进入第 2 组,一些记录进入第 3 组。

如何确保第 1 组的所有记录都转到第 2 组或第 3 组?

谢谢。

4

1 回答 1

0

解决方案是使用 SQL Server 的提示。在此链接中有更多信息。

初步更新:

Update Mytable set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

它修改为:

Update Mytable with(tablock) set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

默认情况下,SQL Server 在进行更新时,只会阻止正在更新的记录,但可以修改其余的记录。所以我需要阻塞所有的表,以避免在其他更新过程中其他更新修改记录。

使用“with(tablock)”可以在更新开始时阻止表。然后搜索与 where 匹配的所有记录并更新它。当表被阻塞时,其他用户不能从该表中选择或更新记录。这就是我在特定情况下所需要的。

于 2013-11-12T15:40:56.257 回答