将SELECT(NOLOCK,READUNCOMMITTED)放在select语句的更新块中是否正确?

时间:2011-11-16 09:54:12

标签: sql sql-server stored-procedures

 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语句中? 我需要这样做才能报告,但我很困惑它是否正确?

2 个答案:

答案 0 :(得分:2)

很难判断NOLOCK提示是否正确而不理解为什么它被放置在那里。

目的是它不会放置行/页锁定而不应该被阻止读取,但它不会完全阻止锁定,因为仍然会发出Sch-S锁(模式稳定性锁)。

无锁是有代价的,但你可以读取未经通信/脏数据而不是事务上的一致性,NOLOCK理论上甚至可以读取同一行两次。

UNCOMMITTED提示没有意义,因为它不是一个有效的提示 - 它可能应该是READUNCOMMITED,这是指定NOLOCK的另一种方式 - 所以这部分似乎毫无意义。

答案 1 :(得分:1)

根据Table Hints (Transact-SQL)

  

无法为插入,更新或删除操作修改的表指定READUNCOMMITTED和NOLOCK。 SQL Server查询优化器忽略应用于UPDATE或DELETE语句的目标表的FROM子句中的READUNCOMMITTED和NOLOCK提示。

Fireball..PositionFireball_Reporting..PositionMaster未修改,因此此提示应该没问题。

修改

我认为你想要写READUNCOMMITTED而不是UNCOMMITTED