2015-07-19 65 views
2

我将行插入到两个实例的单个表中,并且它们正在成功完成。 当任何事务更新任何表时,它将在该表(资源)上获得'独占',并且在插入数据时必须有单独的独占锁。在同一个表上是否有两个独占锁

   Granted 
Requested  Exclusive(X) Shared(S) 
Exclusive  NO    NO 
Shared   NO    Yes 

创建示例表:

create table TestTransaction 
(
Colid int Primary Key, 
name varchar(10) 
) 

插入实例1:

Declare @counter int =1 
Declare @countName varchar(10)='te' 
Declare @max int=1000000 
while @counter<@max 
Begin 
insert into TestTransaction 
values 
(
@counter, 
@countName+Cast(@counter as varchar(7)) 
) 
Set @[email protected]+1 
End 

插入实例2:

insert into TestTransaction 
values 
(2000001,'yesOUTofT') 

为什么它是成功的? 同时从表中检索(选择)不会发生,因为表上的锁定。

+0

你看过实际存在的锁吗? –

回答

2

当任何事务更新任何表时,它会在该表(资源)上获得'独占',并且在插入数据时必须存在单独的独占锁。

这是一个普遍的神话。 SQL Server中的锁通常是每行。各种各样的事情导致他们升级到页面,分区或表级别。尽管如此,SQL Server的设计尝试首先锁定最小的级别,以便实现更多的并发性。

如果可以的话,不要依赖任何特定的锁定行为。相反,如果可能的话,利用隔离级别设置来获得所需的一致性保证。

相关问题