同一桌上有两个独占锁

时间:2015-07-19 08:58:10

标签: sql-server sql-server-2008-r2

我从两个实例中将行插入到单个表中,并且它们已成功完成。 当任何交易更新任何表格时,它会获得“排除”。在该表(资源)上,插入数据时必须在表上有单独的独占锁。

               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 @counter=@counter+1
End

插入实例2:

insert into TestTransaction 
values
(2000001,'yesOUTofT')   

为什么成功? 同时,由于表上的锁定,没有发生从该表中检索(选择)。

1 个答案:

答案 0 :(得分:2)

  

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

这是一个普遍的神话。 SQL Server中的锁通常是每行。各种因素导致它们升级到页面,分区或表级别。但是,SQL Server的设计目的是首先尝试锁定最小级别,以便实现更高的并发性。

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