我从两个实例中将行插入到单个表中,并且它们已成功完成。 当任何交易更新任何表格时,它会获得“排除”。在该表(资源)上,插入数据时必须在表上有单独的独占锁。
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')
为什么成功? 同时,由于表上的锁定,没有发生从该表中检索(选择)。
答案 0 :(得分:2)
当任何事务更新任何表时,它在该表(资源)上获取'Exclusive',并且在插入数据时必须在表上有单独的Exclusive锁。
这是一个普遍的神话。 SQL Server中的锁通常是每行。各种因素导致它们升级到页面,分区或表级别。但是,SQL Server的设计目的是首先尝试锁定最小级别,以便实现更高的并发性。
如果可以,请不要依赖应用中的任何特定锁定行为。相反,如果可能,请使用隔离级别设置,以获得所需的一致性保证。