今天有被问到:sqlserver锁定一行的最小锁是什么?
当时答曰:行级锁
回来查文档,得有关锁的信息(sql2k用syslockinfo表查, sql2k5用sys.dm_tran_locks表查):
资源类型:
1 = NULL 资源(未使用)
2 = 数据库
3 = 文件
4 = 索引
5 = 表
6 = 页
7 = 键
8 = 区
9 = RID(行 ID)
10 = 应用程序OK,现在来看看锁定到一行的最小级别的锁是什么。
D:\Program Files\Microsoft SQL Server\90\Tools\Binn>osql -Usa -Pdba123 -Sdragon
1> create table t_pk(t_id int primary key, t_desc varchar(50));
2> create table t_heap(t_id int, t_desc varchar(50));
3> go
1> insert into t_pk values(1, 'welcome');
2> insert into t_pk values(2, 'nice to meet you');
3> insert into t_pk values(3, 'wall street, stock');
4> go
(1 行受影响)
(1 行受影响)
(1 行受影响)
1> insert into t_heap select * from t_pk;
2> go
(3 行受影响)
1> begin tran
2> update t_pk set t_desc = 'have a nice day' where t_id = 3;
3> go
(1 行受影响)
现在,我更新有主键的表t_pk,看看sqlserver锁了些什么东东:
这里,sqlserver对t_pk表以及相应的page加上了IX锁,对更新的那一行加上了X锁。
再来,现在试试对堆表的更新:
1> rollback;
2> go
1> begin tran
2> update t_heap set t_desc = 'have a nice day' where t_id = 3;
3> go
