【发布时间】:2010-03-06 20:22:45
【问题描述】:
为什么,使用 Sql Server 上的默认设置(因此事务隔离级别 = 已提交读取),这个测试:
CREATE TABLE test2 (
ID bigint,
name varchar(20)
)
然后在一个 SSMS 选项卡中运行它:
begin transaction SH
insert into test2(ID,name) values(1,'11')
waitfor delay '00:00:30'
commit transaction SH
和这个同时在另一个标签中:
select * from test2
要求第二次选择等待第一次完成后再返回??
我们还为第二个查询尝试了这些:
select * from test2 NOLOCK WHERE ID = 1
并尝试在第一个查询中插入一个 ID,并在第二个查询中选择另一个 ID。
这是页面锁定的结果吗?在运行 2 个查询时,我也运行了这个:
select object_name(P.object_id) as TableName, resource_type, resource_description
from
sys.dm_tran_locks L join sys.partitions P on L.resource_associated_entity_id = p.hobt_id
并得到了这个结果集:
test2 RID 1:12186:5
test2 RID 1:12186:5
test2 第 1 页:12186
test2 PAGE 1:12186
【问题讨论】:
-
您使用的是什么版本的 SQL Server?从 2000 年起,SQL Server 默认使用行级锁,而不是页锁。
标签: sql-server select locking