【向All提问】锁的问题,请解析一下。

csdyyr 2009-08-29 12:29:33
加精
--表ta建有复合主键pk_ta(a,b)
--在连接1执行以下语句:
create table ta(a int not null, b int not null, c int, constraint pk_ta primary key(a,b))
insert ta
select 1,2,3 union all
select 1,3,4

begin tran
select * from ta with(xlock)

-- rollback tran
-- sp_lock
-- drop table ta

--在另一连接中分别执行以下查询:
select * from ta --1,无阻塞
select * from ta where a=1 --2, 无阻塞
select * from ta where b=1 --3, 被阻塞
select * from ta where c=1 --4, 被阻塞

请问为什么第3,4句会被阻塞呢?
...全文
862 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
bancxc 2009-09-11
  • 打赏
  • 举报
回复
新人第一次见老大
soft_wsx 2009-09-01
  • 打赏
  • 举报
回复
老大来了,撤吧!
hywel_lee 2009-09-01
  • 打赏
  • 举报
回复
锁有很多种的啊!!!要具体情况具体分析啊!!!
xupeihuagudulei 2009-09-01
  • 打赏
  • 举报
回复
晚上扫帖
cxmcxm 2009-08-31
  • 打赏
  • 举报
回复
sql server帮助:
XLOCK
指定应采取排它锁,且保持到由语句所处理的全部数据上的事务结束。如果与 PAGLOCK 或 TABLOCK 一同指定,则排它锁适用于适当的粒度级别。
-----------------------------------------------
再加上tablock就可锁得住,
也许不指定锁粒度,就由sql server自己自由控制吧!

gaswei 2009-08-31
  • 打赏
  • 举报
回复
mark
lsd123 2009-08-31
  • 打赏
  • 举报
回复
.
XGJ889 2009-08-31
  • 打赏
  • 举报
回复
需要学习
hdp441024615 2009-08-31
  • 打赏
  • 举报
回复
顶、
http://www.xinkeor.cn/?11604-1.html
csdyyr 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 herowang 的回复:]
KG说的是2005以后的吧,在2000上,使用sp_lock可以看到在第三个和第四个查询上面,所要使用的资源使用的是ix锁,在相应的索引键上也加锁了。但是在第二个查询,b这列的貌似并没有加锁,很奇怪的问题。

下午回帖时,断电,敲了那么多的东西,一下子没了,Y的呸呸的
[/Quote]
老师辛苦了!
参考上面的回复,对于SQL2005容易理解了。
在SQL2000中,运行连接1的语句后,索引键上有X锁,页和表上有IX锁。然后运行连接2的第一,二句不被阻塞,是因为这两句忽略掉了X锁。运行第三,四句后,再运行SP_LOCK发现第三,四都在等待索引键上的S锁,说明此时索引键上的X锁没有被忽略,而导致了第三,四被阻塞。另外,最后三句的不同是,第二句执行集聚索引查找,而第三四句是聚集索引扫描。
如有不对,请大家指正。
tonny_123 2009-08-30
  • 打赏
  • 举报
回复
向高手学习学习。
wrong1111 2009-08-30
  • 打赏
  • 举报
回复
对于SQLSERVER 还需要学习。。。
hzs0425 2009-08-30
  • 打赏
  • 举报
回复
向高手学习!
--小F-- 2009-08-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xman_78tom 的回复:]
前两个语句根本就没有请求 S 锁,不信你可以用“事件跟踪器”跟踪一下。如果你把 select * from ta with(xlock) 语句换成 update 语句,在另一会话中执行的 select 语句都会请求 s 锁。
这可能与 select 查询的优化有关。
[/Quote]

学习
csdyyr 2009-08-29
  • 打赏
  • 举报
回复
感谢xman大侠的再次关注!
我认为如果要查询数据,不是一定要先设置共享锁吗?在事件跟踪器如何看到某语句请求了哪种类型的锁呢?
xman_78tom 2009-08-29
  • 打赏
  • 举报
回复
前两个语句根本就没有请求 S 锁,不信你可以用“事件跟踪器”跟踪一下。如果你把 select * from ta with(xlock) 语句换成 update 语句,在另一会话中执行的 select 语句都会请求 s 锁。
这可能与 select 查询的优化有关。
黄_瓜 2009-08-29
  • 打赏
  • 举报
回复
学习
guguda2008 2009-08-29
  • 打赏
  • 举报
回复
学习。。。。
moonfish11 2009-08-29
  • 打赏
  • 举报
回复
学习了!。。
gaozhikun556 2009-08-29
  • 打赏
  • 举报
回复
bu c sfsfsfs
加载更多回复(40)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧