在select语句中将WITH (NOLOCK, READUNCOMMITTED)放在update block中是否正确


 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..PositionFireball_Reporting..PositionMaster没有被修改,所以这个提示应该是好的。

编辑:

我假设你想写READUNCOMMITTED而不是UNCOMMITTED

最新更新