0

我有一个基于选择结果的更新查询,通常返回超过 1000 行。

如果其中一些行在此更新可以触及之前被其他查询更新,是否会导致记录出现问题?例如,他们会不会与原始查询不同步?

如果是这样,选择和更新单个行而不是批量更新会更好吗?

如果有所不同,则查询正在 Microsoft SQL Server 2008 R2 上运行

谢谢。

4

3 回答 3

0

不。

当其他东西正在更新它时,无法更新表。

数据库使用并发控制并具有 ACID 属性来完全防止此类问题。

于 2012-06-27T16:42:23.503 回答
0

我建议阅读隔离级别。SQL Server 中的默认值为READ COMMITTED,这意味着其他事务无法读取已更新但未由给定事务提交的数据。

这意味着您的 select/update 语句返回的数据将及时准确地反映数据库。

如果您要将数据库更改为,READ UNCOMMITTED那么您可能会遇到选择/更新中的数据不同步的情况。

于 2012-06-27T16:43:30.197 回答
-1

如果您先选择,然后更新,则可以使用事务

BEGIN TRAN

-- your select WITHOUT LOCKING HINT

-- your update based upon select

COMMIT TRAN

但是,如果您直接从选择中更新,则无需担心。单笔交易是隐含的。

UPDATE mytable
  SET value = mot.value
FROM myOtherTable mot

但是...不要执行以下操作,否则您会遇到死锁

UPDATE mytable
  SET value = mot.value
FROM myOtherTable mot WITH (NOLOCK)
于 2012-06-27T16:44:24.200 回答