我可以在数据库范围内应用NOLOCK吗?
没有,但你可以使用SQL Server 2005上的SNAPSHOT ISOLATION数据库级及以上,应该有很大的帮助死锁
SQL Server 2005引入扩展到SQL-92隔离级别与引进的快照隔离级别和READ COMMITTED的附加实现。新的READ_COMMITTED_SNAPSHOT隔离级别可以透明地替换所有事务的READ COMMITTED。
SNAPSHOT隔离指定在事务内读取的数据永远不会反映其他同时事务所做的更改。事务使用交易开始时存在的数据行版本。数据读取时不会锁定数据,因此SNAPSHOT事务不会阻止其他事务写入数据。写入数据的事务不会阻止快照事务读取数据。您需要通过设置ALLOW_SNAPSHOT_ISOLATION数据库选项来启用快照隔离才能使用它。
READ_COMMITTED_SNAPSHOT数据库选项确定在数据库中启用快照隔离时,默认READ COMMITTED隔离级别的行为。如果您没有明确指定READ_COMMITTED_SNAPSHOT ON,则将READ COMMITTED应用于所有隐式事务。这产生与设置READ_COMMITTED_SNAPSHOT OFF(默认值)相同的行为。当READ_COMMITTED_SNAPSHOT OFF有效时,数据库引擎使用共享锁来强制执行默认隔离级别。如果将READ_COMMITTED_SNAPSHOT数据库选项设置为ON,则数据库引擎将使用行版本控制和快照隔离作为默认值,而不是使用锁来保护数据。
取决于您的数据库。某些数据库引擎允许您默认为脏读或类似行为。
例如,某些MSSQL Server版本允许您将数据库设置为快照隔离,SQLMenace的文章中对此进行了描述。
快照隔离不是脏读,快照隔离是对数据的读取,就像您开始批处理时一样。肮脏的阅读是读取从未提交但可能已被回滚的数据(nolock,未定义的) – SQLMenace 2010-05-14 17:22:31
感谢您指出这一点,希望我的回答现在没有那么具有误导性。虽然,提问者仍然没有指定他的数据库,并且可能不会。 – marr75 2010-05-18 15:17:40