我可以在数据库范围内设置NOLOCK吗?

时间:2010-05-14 17:14:31

标签: sql database nolock

有没有办法让WITH(NOLOCK)应用于在特定数据库上运行的任何SELECT语句?

2 个答案:

答案 0 :(得分:5)

否,但您可以在SQL Server 2005及更高版本上使用SNAPSHOT ISOLATION数据库级别,它应该对死锁有很大帮助

SQL Server 2005引入了SNAPSHOT隔离级别和READ COMMITTED的附加实现,从而引入了SQL-92隔离级别的扩展。新的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,则数据库引擎将使用行版本控制和快照隔离作为缺省值,而不是使用锁来保护数据。

答案 1 :(得分:0)

取决于您的数据库。某些数据库引擎允许您默认为脏读或类似行为。

示例,某些MSSQL Server版本允许您将数据库设置为快照隔离,这在SQLMenace的帖子中有描述。