Answers:
我不会讨论这个READ UNCOMMITTED
论点,而只是您的原始问题。
是的,您需要WITH(NOLOCK)
在联接的每个表上。不,您的查询不一样。
试试这个练习。开始事务并将行插入到table1和table2中。暂时不要提交或回滚事务。至此,您的第一个查询将成功返回并包含未提交的行;您的第二个查询将不会返回,因为table2没有WITH(NOLOCK)
提示。
我非常确定您需要在查询中NOLOCK
为每个指定JOIN
。但是我的经验仅限于SQL Server 2005。
当我查找MSDN只是为了确认时,找不到任何确定的东西。以下语句似乎使我认为,对于2008年,您的上述两个语句是等效的,尽管对于2005年不是这样:
[SQL Server 2008 R2]
所有锁定提示都传播到查询计划访问的所有表和视图,包括视图中引用的表和视图。此外,SQL Server执行相应的锁一致性检查。
[SQL Server 2005]
在SQL Server 2005中,所有锁定提示都传播到视图中引用的所有表和视图。此外,SQL Server执行相应的锁一致性检查。
此外,请注意-这适用于2005年和2008年:
如果查询计划未访问表,则将忽略表提示。这可能是由于优化程序选择根本不访问表,或者是因为访问了索引视图导致的。在后一种情况下,可以通过使用
OPTION (EXPAND VIEWS)
查询提示来防止访问索引视图。
都不行 您将隔离级别设置READ UNCOMMITTED
为始终比提供单个锁定提示更好。或者,更好的是,如果您关心诸如一致性之类的细节,请使用快照隔离。
using (TransactionScope scope=new TransactionScope(..., TransactionOptions) {...}
,并设置IsolationLevel
上的选项:msdn.microsoft.com/en-us/library/...
ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;
。结果是惊人的,因为所有常规读取提交的读取都变成快照读取,无锁但一致。成本增加了tempdb
负载:msdn.microsoft.com/en-us/library/ms175492.aspx