有没有办法使 WITH(NOLOCK) 应用于在特定数据库上运行的任何 SELECT 语句?
2 回答
不,但您可以在 SQL Server 2005 及更高版本上使用SNAPSHOT ISOLATION数据库级别,它应该对解决死锁有很大帮助
SQL Server 2005 引入了对 SQL-92 隔离级别的扩展,引入了 SNAPSHOT 隔离级别和 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 的帖子中有所描述。