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语句中? 我需要这样做才能报告,但我很困惑它是否正确?
答案 0 :(得分:2)
很难判断NOLOCK提示是否正确而不理解为什么它被放置在那里。
目的是它不会放置行/页锁定而不应该被阻止读取,但它不会完全阻止锁定,因为仍然会发出Sch-S锁(模式稳定性锁)。
无锁是有代价的,但你可以读取未经通信/脏数据而不是事务上的一致性,NOLOCK理论上甚至可以读取同一行两次。
UNCOMMITTED提示没有意义,因为它不是一个有效的提示 - 它可能应该是READUNCOMMITED,这是指定NOLOCK的另一种方式 - 所以这部分似乎毫无意义。
答案 1 :(得分:1)
无法为插入,更新或删除操作修改的表指定READUNCOMMITTED和NOLOCK。 SQL Server查询优化器忽略应用于UPDATE或DELETE语句的目标表的FROM子句中的READUNCOMMITTED和NOLOCK提示。
表Fireball..Position
和Fireball_Reporting..PositionMaster
未修改,因此此提示应该没问题。
修改强>
我认为你想要写READUNCOMMITTED
而不是UNCOMMITTED
。