首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >事务总是原子的吗?

事务总是原子的吗?
EN

Stack Overflow用户
提问于 2011-07-12 04:12:06
回答 5查看 1.8K关注 0票数 4

我正在尝试更好地了解SQL Server事务的细微差别。

假设我有一个更新1,000个现有行的查询,将其中一列更新为从1到1,000的值。可以执行此查询,当查询完成时,这些行将不会按顺序编号。这是因为在我的查询完成之前,另一个查询可能会修改其中的一行。

另一方面,如果我将这些更新包装在一个事务中,这就保证了如果任何一个更新失败,我也可以使所有更新失败。但这是否也意味着当我完成操作时,这些行将被保证是连续的?

换句话说,事务总是原子的吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-12 07:43:15

这两点是不相关的

顺序

如果您插入1到1000之间的值,它将是连续的,并带有WHERE和ORDER BY,以限制您在某些列中只能插入这1000行。除非有副本,否则需要一个唯一的约束

如果你依赖于一个身份,就不能保证:Do Inserted Records Always Receive Contiguous Identity Values

原子性

所有事务都是原子的:

票数 2
EN

Stack Overflow用户

发布于 2011-07-12 04:26:22

,但这是否也意味着,当我完成操作时,将保证这些行是连续的?

不是的。这与事务无关,因为您所要求的根本不存在:关系表没有顺序,要求“连续行”是错误的问题。您可以将问题重新表述为“更新的1000行是否包含从1到1000的整个序列,没有间隙”?很可能是这样的,但事实是,根据您进行更新的方式,可能会有差距。这些间隙不会出现,因为更新后的行在提交之前被修改,而是因为更新将是无操作(不会更新任何行),这是读-修改-写回类型的更新的常见问题(由于并发操作,行在读和写回之间“消失”)。

为了更准确地回答您的问题,您的代码是否正确,您必须发布执行更新的确切代码,以及确切的表结构,包括所有索引。

票数 5
EN

Stack Overflow用户

发布于 2011-07-12 04:18:35

原子意味着事务中的操作要么发生,要么不发生。

如果1,000条语句中有一条语句失败,则事务内的操作将提交none。事务中的语句样本越小--比如100个--意味着可以提交导致错误的100个块(比如501个)(前400个;500个块不提交,600+块提交)。

,但这是否也意味着,当我完成操作时,将保证这些行是连续的?

你必须提供更多关于你在事务中所做的事情的上下文,才能是“顺序的”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6655932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档