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 提供了多种隔离级别;选择能够提供您的数据消费者所需的保证和行为的一种。
是的,默认情况下它确实在它读取的行上使用共享锁(它还在它将读取的聚集索引的所有页面上使用 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
归档时间: |
|
查看次数: |
53243 次 |
最近记录: |