|
Re: csdn上的朋友的回复,有点思路,转过来
最初由 孤烟 发布
[B]是的,在1楼所建的表中,你执行
begin tran
update tb with (ROWLOCK)
set A='aa'
where B='b2'
waitfor delay '00:01:00' --等待1分钟
commit tran
在控制台的锁/进程ID中都是RID,PAG,TAB三个锁一起出现!说明3个锁一起加了!
实际上当有行锁出现时,页和表都会出现意向锁。
SQL SERVER 2000的解释:
意向锁
意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。
意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。
但现在发现:页和表的意向排它 (IX)锁会堵塞别的事务企图在该表中获得行锁,意义同表锁类似呀!
虽然
SQL SERVER 2000的资料说:
说明 意向排它 (IX) 锁与 IX 锁模式兼容,因为 IX 表示打算更新一些行而不是所有行。还允许其它事务读取或更新部分行,只要这些行不是其它事务当前所更新的行即可。
但实际上好象不是这样。 [/B]
对于这个问题,我的理解是这样的:
EXAMPLE:
BEGIN TRAN
DELETE FROM Test where c1=1
通过sp_lock查看:
spid dbid ObjId IndId Type Resource Mode Status
------ ------ ----------- ------ ---- ---------------- -------- ------ ------------------------------------
53 7 789577851 1 PAG 1:126 IX GRANT
53 7 789577851 1 KEY (010086470766) X GRANT
53 7 789577851 1 PAG 1:127 IX GRANT
53 7 789577851 2 KEY (090041892960) X GRANT
53 7 789577851 0 TAB IX GRANT
我分别解释如下:
id 789577851就是表Test,可以查询sysobjects。
首先,关于TAB的IX,是表结构的意向排他锁[/COLOR] 。此时,如果你执行ALTER TABLE命令来改变表结构(会对表结构上X锁)是会被挂住的。
其次,PAG是页锁,就是索引页锁,此时为什么会有两个呢?显然1:126是索引树的中间页节点页面,而1:127是叶节点页,也就是数据页(聚集索引的表存储结构)。因此,任何对索引页上X锁的操作都会被挂住,而上IX,S不会,SQL Server会进一步判断行级锁。
最后, KEY (010086470766) ,KEY (090041892960) 的两个X最明显了,就是行级独占锁。一个是索引中间页上的行级锁,一个是叶节点(数据页)上的行级锁。 |
|