UPDATE
BondPrices
SET
MarketValueOwned = Holdings.Amount
FROM
BondPrices BondPrices
INNER JOIN
(
SELECT
PM.SecurityId,
SUM(Pos.QuantityTraded * Pos.Mark) AS Amount
FROM
Position Pos --WITH (NOLOCK, READUNCOMMITTED)
INNER JOIN
PositionMaster PM --WITH (NOLOCK, READUNCOMMITTED)
ON
Pos.PositionMasterId = PM.PositionMasterId
WHERE
Pos.Date = @ReportDate
GROUP BY
PM.SecurityId
) Holdings ON
BondPrices.SecurityId = Holdings.SecurityId
WHERE
BondPrices.Date = @ReportDate
请帮助我,我是正确的,我把WITH (NOLOCK, READUNCOMMITTED)在更新块的select语句?我需要这样做是为了报告目的,但我不知道这是否正确?
如果不了解NOLOCK提示放在那里的原因,就很难判断它是否正确。
这样做的目的是不放置行/页锁,也不应该被阻塞读取,但它并不能完全阻止锁定,因为Sch-S锁(模式稳定锁)仍然会发出。
无锁是有代价的,但是,你可以读取未提交/脏数据,并且不具有事务一致性,理论上,NOLOCK甚至可以读取同一行两次。
UNCOMMITTED提示没有意义,因为它不是一个有效的提示——它可能应该是readuncommitted,这是指定NOLOCK的另一种方式——所以那部分看起来毫无意义。
根据表提示(Transact-SQL):
对于被插入、更新、删除操作修改过的表,不能指定READUNCOMMITTED和NOLOCK。SQL Server查询优化器会忽略FROM子句中适用于UPDATE或DELETE语句的目标表的READUNCOMMITTED和NOLOCK提示。
表Fireball..Position
和Fireball_Reporting..PositionMaster
没有被修改,所以这个提示应该是好的。
我假设你想写READUNCOMMITTED
而不是UNCOMMITTED
。