一个简单的选择查询是否获取锁?

New*_*per 15 sql-server-2008 sql-server locking

我对 SQL Server 很陌生,想了解以下非常简单的select语句是否需要任何锁。

Select * from Student;
Run Code Online (Sandbox Code Playgroud)

请考虑语句不会在begin tran块内运行的情况。

Pau*_*ite 27

我想了解以下非常简单的 select 语句是否需要任何锁定

一个常见的误解SELECT,在默认READ COMMITTED事务隔离级别运行的查询将始终采用共享锁来防止脏读。

当没有读取未提交的数据没有危险时,SQL Server 可以避免使用共享行级锁(尽管仍然使用更高级别的意图共享 (IS) 锁)。

即使共享行锁采取了(可能是因为其它并发事务已经修改了页面的行上),它们可以长期被释放之前,SELECT语句完成。

在大多数情况下,该行在服务器处理下一行之前被“解锁”。在某些情况下,在默认隔离级别采用的共享锁会一直保持到当前语句的末尾,但不会一直保持到事务的末尾。

NOLOCK表提示覆盖当前的隔离级别几乎总是一个坏主意

锁定是一个实现细节。SQL Server在必要时使用锁以确保它满足当前隔离级别提供的语义保证。在某些时候,了解一点关于为什么要使用锁是有用的,但是试图预测它们通常会适得其反。

SQL Server 提供了多种隔离级别;选择能够提供您的数据消费者所需的保证和行为的一种。


Wri*_*ree 5

是的,默认情况下它确实在它读取的行上使用共享锁(它还在它将读取的聚集索引的所有页面上使用 Intent Shared 锁),这样做是为了防止脏读。但是有一些方法可以绕过这个(SQL Server 有 nolock 提示)。如果语句不在 BEGIN TRAN 中,则在 SELECT 语句运行后释放锁。

更多信息可以在这里找到:

http://msdn.microsoft.com/en-us/library/ms184286(v=sql.105).aspx http://www.sqlteam.com/article/introduction-to-locking-in-sql-server