我有一个基于选择结果的更新查询,通常返回超过 1000 行。
如果其中一些行在此更新可以触及之前被其他查询更新,是否会导致记录出现问题?例如,他们会不会与原始查询不同步?
如果是这样,选择和更新单个行而不是批量更新会更好吗?
如果有所不同,则查询正在 Microsoft SQL Server 2008 R2 上运行
谢谢。
我有一个基于选择结果的更新查询,通常返回超过 1000 行。
如果其中一些行在此更新可以触及之前被其他查询更新,是否会导致记录出现问题?例如,他们会不会与原始查询不同步?
如果是这样,选择和更新单个行而不是批量更新会更好吗?
如果有所不同,则查询正在 Microsoft SQL Server 2008 R2 上运行
谢谢。
不。
当其他东西正在更新它时,无法更新表。
数据库使用并发控制并具有 ACID 属性来完全防止此类问题。
我建议阅读隔离级别。SQL Server 中的默认值为READ COMMITTED
,这意味着其他事务无法读取已更新但未由给定事务提交的数据。
这意味着您的 select/update 语句返回的数据将及时准确地反映数据库。
如果您要将数据库更改为,READ UNCOMMITTED
那么您可能会遇到选择/更新中的数据不同步的情况。
如果您先选择,然后更新,则可以使用事务
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)