让我们考虑一个场景:
两个或更多人正在处理存储应用程序配置数据的表。该表中有多种配置,因此每个人都可以处理自己的数据集。
编辑 200 行功能比编写脚本要快,因为脚本中有很多特殊字符需要转义,在编辑中大多数情况下只是复制和粘贴。
每个人都在特定于配置的行上工作,因此编辑查询包含 where 子句。当然,它不会经常发生,但在测试时,有时会出现一些不寻常的此类活动。
现在的问题是:当更改保存在 Edit 200 rows 中时,SSMS 是提交整个表还是只提交窗格中的行?另外:如果两个人不小心在同一个数据集上工作——他们会覆盖彼此的工作吗?
我的直觉对第一行说“不,只是特定行”,对第二行说“是”,但我找不到任何关于 SSMS UI 功能如何在后台工作的描述(这可能是因为我异常缓慢并且今天很密集......不是日冕,但感觉不舒服)。
没有“提交整张桌子”之类的东西。执行的修改会根据 WHERE 子句影响 x 行数。在事务结束时(语句结束,除非您指定 BEGIN tran 并且您现在说 COMMIT 或 ROLLBACK),已修改的行将被提交或回滚。
至于发生冲突的可能性。我可以看到两种寻求答案的方法:
运行跟踪并查看提交了什么 SQL。
试试看。
我进行了跟踪,但在 T-SQL 上没有看到任何可以保护您免受冲突的东西。
但是,当我尝试以“第二人称”进行修改时,我在 SSMS 中收到一条消息:
SSMS 所做的是为每列提交一个带有 WHERE 子句的 UPDATE(与您读取该行时的值进行比较)。如果它返回 0 行,它假定其他人在我们查看该行时修改了该行,并要求我们这样做(我没有 SSMS 的源代码,所以这句话是我对它如何做的假设它)。如果我们说“是”,那么它只针对主键列再提交一个带有 WHERE 子句的 UPDATE。这是我跟踪中的这两个更新,第二个是在我在上面的对话框中回答“是”后提交的: