[英]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条记录。 用户一执行更新。 因此,步骤如下:
同时,第二个用户执行查询。
是否有可能第二个用户在第一个用户的查询更新之前更新了记录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.