我正在尝试更好地了解SQL Server事务的细微差别。
假设我有一个更新1,000个现有行的查询,将其中一列更新为从1到1,000的值。可以执行此查询,当查询完成时,这些行将不会按顺序编号。这是因为在我的查询完成之前,另一个查询可能会修改其中的一行。
另一方面,如果我将这些更新包装在一个事务中,这就保证了如果任何一个更新失败,我也可以使所有更新失败。但这是否也意味着当我完成操作时,这些行将被保证是连续的?
换句话说,事务总是原子的吗?
发布于 2011-07-12 04:26:22
,但这是否也意味着,当我完成操作时,将保证这些行是连续的?
不是的。这与事务无关,因为您所要求的根本不存在:关系表没有顺序,要求“连续行”是错误的问题。您可以将问题重新表述为“更新的1000行是否包含从1到1000的整个序列,没有间隙”?很可能是这样的,但事实是,根据您进行更新的方式,可能会有差距。这些间隙不会出现,因为更新后的行在提交之前被修改,而是因为更新将是无操作(不会更新任何行),这是读-修改-写回类型的更新的常见问题(由于并发操作,行在读和写回之间“消失”)。
为了更准确地回答您的问题,您的代码是否正确,您必须发布执行更新的确切代码,以及确切的表结构,包括所有索引。
https://stackoverflow.com/questions/6655932
复制相似问题