我正在努力更好地理解SQL Server事务的细微差别。
假设我有一个更新1,000个现有行的查询,更新其中一个列的值为1到1,000。可以执行此查询,并且在完成时,这些行不会按顺序编号。这是因为在我的查询完成之前,另一个查询可能会修改其中一行。
另一方面,如果我将这些更新包装在一个事务中,这可以保证如果任何一个更新失败,我可能会失败所有更新。但这是否也意味着当我完成这些行时将保证顺序?
换句话说,交易总是原子的吗?
答案 0 :(得分:5)
但它是否也意味着当我完成这些行时将保证顺序?
没有。这与事务无关,因为您所要求的内容根本不存在:关系表没有命令要求“顺序行”是一个错误的问题。您可以将问题重新定义为“1000个更新的行是否包含从1到1000的整个序列,没有间隙”?很可能是的,但问题的真相是,根据您进行更新的方式可能存在差距。这些差距不会出现,因为更新的行在提交之前的更新之后被修改,但是因为更新将是无操作(不会更新任何行),这是读取 - 修改 - 写回更新类型的常见问题(由于并发操作,读取和回写之间的行“消失”。
为了更准确地回答您的问题,您的代码是否正确,您必须发布您正在进行更新的确切代码,以及确切的表结构,包括所有索引。
答案 1 :(得分:4)
原子意味着交易中的操作可能发生,也可能不发生。
如果1,000个语句中的一个失败,则事务中的操作的 none 将提交。事务中的语句样本越小 - 比如100 - 意味着可以提交导致错误的100个块(例如在501)(前400个; 500个块不会,600个) +块将)。
但它是否也意味着当我完成这些行时将保证顺序?
您必须提供有关您在交易中所做的事情的更多背景信息,以便“顺序”。
答案 2 :(得分:2)
SQL事务(如所有数据库平台上的事务)将数据隔离,以覆盖整个ACID首字母缩写(原子,一致,隔离和持久)。所以答案是肯定的。
答案 3 :(得分:2)
2分无关
如果您插入值1到1000,它将与WHERE和ORDER BY顺序,以限制您在某些列中的这1000行。除非有重复,否则你需要一个独特的约束
如果您依赖IDENTITY,则无法保证:Do Inserted Records Always Receive Contiguous Identity Values。
所有交易都是原子的:
答案 4 :(得分:0)
交易保证原子性。这就是重点。
问题在于,在执行插入操作后,它们只是“顺序”,直到下一个出现并触及其中一个新记录。
如果您处理中的另一个步骤要求它们仍然是顺序的,那么该步骤也需要在您的原始事务中。