繁体   English   中英

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

[英]how does an update work? is it a transaction?

我有这张桌子:

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组?

谢谢。

解决方案是使用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匹配的所有记录并进行更新。 当表被阻止时,没有其他用户可以从该表中选择或更新记录。 这是我在特定情况下需要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM