更新如何工作?这是一笔交易吗?

时间:2013-11-12 09:15:02

标签: sql-server-2008 transactions updates

我有这张桌子:

Mytable(ID, IDGroupReference, Model ...)

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

select * from MyTable where IDGroupReference = 12345;

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

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

Update Mytable set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

我使用第一组的IDGroupReference设置组2的IDGroupReference。

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

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

因此,当我使用更新时,它是如何工作的?是一个交易,没有人可以更新任何将受影响的记录或第二个用户可以在第一个用户更新过程中更新记录?

我的意思是:

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

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

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

第二个用户可能在第一个用户的查询更新之前更新了记录3吗?因为如果发生这种情况,那么第1组将分为两组,一些记录转到第二组,其中一些记录转到第3组。

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

感谢。

1 个答案:

答案 0 :(得分:0)

解决方案是使用SQL Server的提示。 In this link there are more information.

初始更新:

Update Mytable set IDGroupReferencia = myIDReferenceGroup1 where IDGroupReference = IDGroupReferencieGroup2

修改为:

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

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

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